前言
最近,许多Java开发者都在讨论说,“不使用的对象应手动赋值为null“ 这句话,而且好多开发者一直信奉着这句话;问其原因,大都是回答“有利于GC更早回收内存,减少内存占用”,但再往深入问就回答不出来了。
鉴于网上有太多关于此问题的误导,本文将通过实例,深入JVM剖析“对象不再使用时赋值为null”这一操作存在的意义,供君参考。本文尽量不使用专业术语,但仍需要你对JVM有一些概念。
示例代码
我们来看看一段非常简单的代码:
public static void main(String[] args) {
if (true) {
byte[] placeHolder = new byte[64 * 1024 * 1024];
System.out.println(placeHolder.length / 1024);
}
System.gc();
}
我们在if中实例化了一个数组placeHolder
,然后在if的作用域外通过System.gc();
手动触发了GC,其用意是回收placeHolder
,因为placeHolder
已经无法访问到了。来看看输出:
65536
[GC 68239K->65952K(125952K), 0.0014820 secs]
[Full GC 65952K->65881K(125952K), 0.0093860 secs]
Full GC 65952K->65881K(125952K)
代表的意思是:本次GC后,内存占用从65952K降到了65881K。意思其实是说GC没有将placeHolder
回收掉,是不是不可思议?
下面来看看遵循“不使用的对象应手动赋值为null“的情况:
public static void main(String[] args) {
if (true) {
byte[] placeHolder = new byte[64 * 1024 * 1024];
System.out.println(placeHolder.length / 1024);
placeHolder = null;
}
Sy