【发布时间】:2011-06-25 08:42:14
【问题描述】:
因此,我正在构建这个非常占用内存的 Java 应用程序,它构建了一个包含数百万个节点的树。使用方便的花花公子 Runtime 方法获取堆信息,我构建了一个不错的小方法来显示当前内存使用情况,如下所示:
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?
任何想法为什么它不能正确地捡垃圾?
【问题讨论】:
-
很抱歉我是个挑剔者。但你不能强制垃圾收集,你只是建议 JVM这样做。 download.oracle.com/javase/6/docs/api/java/lang/…
-
@Nishant:当对 API 的实际效果存在明显误解时,这并不是吹毛求疵。
标签: java memory-management heap-memory