所以我有這個內存密集型的Java應用程序,它構建了一個有數百萬個節點的樹。利用方便的花花公子運行一些方法來獲取堆信息,我建,顯示當前內存的使用情況,如下圖所示一個可愛的小方法:Java垃圾收集問題
public void displayMemoryUsage() {
long maxMem = Runtime.getRuntime().maxMemory();
long freeMem = Runtime.getRuntime().freeMemory();
long heapMem = Runtime.getRuntime().totalMemory();
long usedMem = heapMem - freeMem;
System.out.println("Memory used: " + (int) (usedMem * 100/maxMem) + "%");
}
所以只是爲了測試一下,我已經在樹中展開根節點(2128個孩子),然後擴展每個孩子(樹中總共約400萬個節點)。內存顯示11%使用。然後,我將樹的根設置爲根的子項之一,並且這樣做可以刪除對根的其他子項的所有引用。從理論上講,這應該刪除原始根的孩子的2127/2128。我運行Java的Runtime.getRuntime()。gc()方法強制垃圾收集,並告訴它再次顯示內存使用情況。這一次,我得到了10%。從理論上講,這個新的百分比是不是應該在設定新根之前的0.05%,或者是價值的1/2128?
任何想法爲什麼它不正確拾取垃圾?
對不起nitpicker ..但你不能_force_垃圾回收,你只是_suggest_ JVM這樣做。 http://download.oracle.com/javase/6/docs/api/java/lang/Runtime.html#gc%28%29 – Nishant 2011-02-11 06:02:44