关于java对象不使用是要赋值为null的问题?
相信很多同学都知道,在对象不使用后要手动赋值为null,问一下原因,大部分人都说这样利于java对象被GC更早的回收,减少内存的占用,为什么要折磨说呀,下面请看一段代码
public static void main(String[] args) {
if (true) {
byte[] placeHolder = new byte[64 * 1024 * 1024];
System.out.println(placeHolder.length / 1024);
}
System.gc();
}
上面的代码是在 if 中实例化了一个byte对象,并且在对象的作用域外手动触发了GC回收了对象,但是我们查看输出结果却发现是这样的
65536
[GC 68239K->65952K(125952K), 0.0014820 secs]
[Full GC 65952K->65881K(125952K), 0.0093860 secs]
这样的输出结果,意味着没有GC没有回收这个对象,因为内存占用并没有减少, 下面来看手动赋值为NULL以后的情况
public static void main(String[] args) {
if (true) {
byte[] placeHolder = new byte[64 * 1024 * 1024];
System.out.println(placeHolder.length / 1024);
placeHolder = null;
}
System.gc();
}
输出为:
65536
[GC 68239K->65952K(125952K), 0.0014910 secs]
[Full GC 65952K->345K(125952K), 0.0099610 secs]
这次GC回收后内存减少了许多,这就意味着这个对象被回收了,也就意味着,手动赋值为NULL可以加快对象的回收;