我有一个简单的例子。这个例子从一个包含10000000个随机整数的文件f
中加载一个ArrayList<Integer>
。
doLog("Test 2");
{
FileInputStream fis = new FileInputStream(f);
ObjectInputStream ois = new ObjectInputStream(fis);
List<Integer> l = (List<Integer>) ois.readObject();
ois.close();
fis.close();
doLog("Test 2.1");
//l = null;
doLog("Test 2.2");
}
doLog("Test 2.3");
System.gc();
doLog("Test 2.4");
当我有 l = null
时,我得到了这个日志:
Test 2 Used Mem = 492 KB Total Mem = 123 MB
Test 2.1 Used Mem = 44 MB Total Mem = 123 MB
Test 2.2 Used Mem = 44 MB Total Mem = 123 MB
Test 2.3 Used Mem = 44 MB Total Mem = 123 MB
Test 2.4 Used Mem = 493 KB Total Mem = 123 MB
但是当我将它移除后,我会得到下面这个日志。
Test 2 Used Mem = 492 KB Total Mem = 123 MB
Test 2.1 Used Mem = 44 MB Total Mem = 123 MB
Test 2.2 Used Mem = 44 MB Total Mem = 123 MB
Test 2.3 Used Mem = 44 MB Total Mem = 123 MB
Test 2.4 Used Mem = 44 MB Total Mem = 123 MB
已使用内存
的计算方式为:runTime.totalMemory() - runTime.freeMemory()
问题:如果存在l = null;
,会导致内存泄漏吗?l
无法访问,为什么不能被释放?
l
,如果你之后可能会用到它,GC 就无法销毁它。 - Uhehesh