在 VisualVM 中研究我的应用程序的行为时,我遇到了这个问题并且感到困惑,我认为执行垃圾收集的 JMX 调用与调用 System.gc()
具有相同的功能,但是在我尝试过的所有环境中,JMX 调用总是导致比对 System.gc()
的调用更小的堆使用,功能上有什么区别?
您可以看到最后一次下降 - 我手动单击“执行 GC”按钮,我的使用率比常规系统收集下降了一点。想一想为什么会这样?
我已经在多个环境中尝试过这个,将集合留给系统并手动调用 System.gc()
,每次 JMX 调用都会清除更多。
正如您在发布的图像中看到的,系统垃圾收集正在运行,JMX 调用只是清除更多,问题是这两个调用之间有什么区别?
最佳答案
这一定是偶然的(因为它在程序执行的不同点被调用或一些类似的因素)- Sun 的 MemoryMXBean
实现,sun.management.MemoryImpl
:
public void gc() {
Runtime.getRuntime().gc();
}
System.gc()
:
public static void gc() {
Runtime.getRuntime().gc();
}
因此,这两种建议垃圾回收的方法在功能上确实没有区别,唯一的区别在于何时以及从哪个线程调用它。
关于java - JMX 垃圾收集和 System.gc() 之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33685089/