所以我有这个内存密集型的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