我的代碼下面的一段:Java垃圾收集和空
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()和註釋列表= null運行上面的代碼時,我可以看到我的可用內存即將到來(在這種情況下爲160944)小於上述測試用例。在這兩種情況下,對象都從內存中移除,但爲什麼這些值是不同的。
'new String(「hello」)'創建兩個對象。這個構造函數不應該被使用。嘗試'list.add(「hello」)' – 2012-04-06 08:34:43
@ajozwik我不會說'從來沒有'。它有一些有效的用例。這就是它存在的原因。 – EJP 2012-04-06 09:45:22