JMX垃圾收集和System.gc()之间的区别?

Mat*_*ark 4 java garbage-collection jmx

当我在VisualVM中研究我的应用程序的行为时,我遇到了这个并且感到困惑,我认为执行垃圾收集的JMX调用将具有与调用相同的功能System.gc(),但是在我尝试过的所有环境中,JMX调用总是导致较小的堆使用量然后调用System.gc(),功能上有什么区别?

在此输入图像描述

你可以在最后一滴上看到 - 我手动点击了执行GC按钮,我的使用率比常规系统集合略低.关于为什么会这样的想法?

我已经在多个环境中尝试了这个,将集合留给系统并手动调用 System.gc(),每次JMX调用都会清除更多.

正如您在发布的图像中看到的那样,系统垃圾收集正在运行,JMX调用只是清除了更多,问题是这两个调用之间有什么区别?

Jir*_*sek 5

这必须是间接的(由于它在程序执行中的不同点或类似因素被调用) - Sun的实现MemoryMXBean,sun.management.MemoryImpl:

public void gc() {
    Runtime.getRuntime().gc();
}
Run Code Online (Sandbox Code Playgroud)

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/sun/management/MemoryImpl.java#MemoryImpl.gc%28%29

System.gc():

public static void gc() {
    Runtime.getRuntime().gc();
}
Run Code Online (Sandbox Code Playgroud)

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/java/lang/System.java#System.gc%28%29

因此,建议垃圾收集的两种方式之间确实没有功能差异,唯一的区别在于调用它的时间和方式.