我有以下代码:
List<String> list = new ArrayList<String>();
// WeakReference<List> wr = new WeakReference<List>(list);
System.out.println(" before tot memory... " + Runtime.getRuntime().totalMemory());
System.out.println(" before free memory... " + Runtime.getRuntime().freeMemory());
for(int i =0; i<100; i++)
list.add(new String("hello"));
//System.gc();
list = null; //forcefully end its life expectancy
System.out.println(" after tot memory... " + Runtime.getRuntime().totalMemory());
System.out.println(" after free memory... " + Runtime.getRuntime().freeMemory());
System.out.println(" after memory used ... " + (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()));
// System.out.println(" weak reference " + wr.get());
当我运行上面的代码时,我可以看到空闲内存是361064(在我的系统中,但是这个值可能会有所不同)
但是当我使用System.gc()和注释list = null运行上面的代码时,我可以看到我的可用内存即将到来(在这种情况下为160944)比上面的测试用例少。在这两种情况下,都会从内存中删除对象。但是为什么这些值不同。
答案 0 :(得分:1)
list = null; 取消任何引用都会自动导致垃圾回收。当您对此行发表评论时,参考列表仍然有效,那么即使您调用 System.gc(),也不会进行垃圾回收。
当您明确调用 gc()时,已经无效的引用或超出范围的引用只会被垃圾回收。
答案 1 :(得分:0)
GC通过查看内存中的所有对象来查找程序中的任何objects which are no longer being referenced
。可以删除这些未使用的对象,以便为新的内存对象腾出空间。
因此,即使您调用System.gc()
,如果仍有任何对象被引用,也无法进行垃圾回收。如果可以在代码中引用对象,如何对象进行垃圾回收?
通过调用list = null
,list
变量引用的对象无法再次引用,因此有资格获取垃圾。