JVM垃圾回收器判断一个对象的内存空间是否无用的标准是:如果该对象不能再被程序中的任何一个“活动的部分”所引用,则该对象的的内存空间已无用。
看下面的例子:
public class JavaMemory
{
private final int dataSize = (int) (Runtime.getRuntime().maxMemory() * 0.6);
public void f()
{
{
byte[] data1 = new byte[dataSize];
}
byte[] data2 = new byte[dataSize];
}
public static void main(String[] args)
{
JavaMemory jmp = new JavaMemory();
jmp.f();
}
}
|
在这个例子中,方法f()里定义了两个局部变量,变量data1和data2的作用域不同。按照正常理解,虽然两各个数组所需要的内存之和已经超过了可用内存,但是因为data1会被及时回收,不会出现内存溢出错误。
然而如果我们实际执行这个例子,会发现出现了 java.lang.OutOfMemoryError错误。
这个问题该如何修正呢,方法其实很简单。只需要在变量作用域结束之前,将变量置为空就可以了。修改之后的结果如下:
public class JavaMemory
{
private final int dataSize = (int) (Runtime.getRuntime().maxMemory() * 0.6);
public void f()
{
{
byte[] data1 = new byte[dataSize];
data1 = null;
}
byte[] data2 = new byte[dataSize];
}
public static void main(String[] args)
{
JavaMemory jmp = new JavaMemory();
jmp.f();
}
}
|