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

标签 java garbage-collection jmx

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

enter image description here

您可以看到最后一次下降 - 我手动单击“执行 GC”按钮,我的使用率比常规系统收集下降了一点。想一想为什么会这样?

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

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

最佳答案

这一定是偶然的(因为它在程序执行的不同点被调用或一些类似的因素)- Sun 的 MemoryMXBean 实现,sun.management.MemoryImpl:

public void gc() {
    Runtime.getRuntime().gc();
}

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();
}

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

因此,这两种建议垃圾回收的方法在功能上确实没有区别,唯一的区别在于何时以及从哪个线程调用它。

关于java - JMX 垃圾收集和 System.gc() 之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33685089/

相关文章:

javascript - 在 JavaScript 中对对象进行垃圾收集之前进行清理 - 如何?

java - Android AppUpdateManager 未初始化自动更新

带代理的Java多线程post方法(使用Jsoup)

java - 如何同步线程: onTouchEvent and run()?

java - 请求 Java ThreadInfo 的堆栈跟踪?

j2se 应用程序的监控和警报

java - activemq jmx mbeans 从远程主机不可见

java - 是否可以仅从字符串中提取数字

.net - 检查 .NET 代码中的 gcTrimCommitOnLowMemory 值

c++ - 有哪些可用于 C++ 的垃圾收集器?