YourKit 或 JProfiler 等Java分析器几乎总是有一个“执行GC ”的按钮。该按钮上的实际文本与此问题无关。此外,当我们在这些工具中获取堆快照时,JVM似乎正在执行垃圾收集。但我知道System.gc()
实际上并不能保证垃圾收集。那么,每次单击特殊按钮或执行堆快照时,这些探查器工具如何确定性地执行GC?他们是否在内部调用了一些非java本机方法来解决System.gc()
调用每次都不强制GC的限制?
答案 0 :(得分:1)
JVM公开了JavaTM Virtual Machine Tool Interface,它允许调试器,分析器和类似工具对虚拟机的内部工作进行更深入的访问,而不是程序可以拥有的(出于好的理由)。 / p>
答案 1 :(得分:0)
考虑堆快照,每次执行堆快照时都会执行完整GC。这与System.gc()
的做法无关。您只需发送“收集堆快照”信号,VM即可完成工作 - 其中包括Full GC。
考虑到执行GC按钮,配置文件将只调用System.gc()
方法。虽然这不可靠但通常有效。请参阅System.gc() vs GC button in JVisualVM/JConsole。