3

像YourKitJProfiler这样的Java 分析器几乎总是有一个显示“ Perform GC ”的按钮。该按钮上的实际文本与此问题无关。此外,当我们在这些工具中拍摄堆快照时,JVM 似乎正在执行垃圾收集。但我知道这System.gc()实际上并不能保证垃圾收集。那么这些分析器工具是如何在每次单击特殊按钮或拍摄堆快照时确定性地实际执行 GC 的呢?他们是否在内部调用了一些非 Java 本机方法来解决System.gc()调用不会每次都强制 GC 的限制?

4

2 回答 2

1

JVM 公开了JavaTM 虚拟机工具接口,它允许调试器、分析器和类似工具比您的程序更深入地访问 VM 的内部工作(也有充分的理由)。

于 2013-09-13T15:35:02.817 回答
0

考虑到堆快照,每次拍摄堆快照时都会执行完整 GC。这与将要做什么System.gc()无关。你只需发送一个“收集堆快照”信号,VM 就会完成这项工作——其中包括一个 Full GC。

考虑到执行 GC 按钮,配置文件将只调用该System.gc()方法。虽然这不可靠,但它通常可以工作。请参阅JVisualVM/JConsole 中的 System.gc() 与 GC 按钮

于 2013-09-13T20:36:43.500 回答