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

时间:2015-11-13 02:43:00

标签: java garbage-collection jmx

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

enter image description here

你可以看到最后一滴 - 我手动点击了执行GC按钮,我的使用率下降了一点,然后是常规系统集合。关于为什么会这样的想法?

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

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

2 个答案:

答案 0 :(得分:5)

这必须是间接的(由于它在程序执行中的不同点或类似因素被调用) - Sun对MemoryMXBeansun.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

因此,建议垃圾收集的两种方式之间确实没有功能差异,唯一的区别在于它何时以及从什么线程调用它。

答案 1 :(得分:0)

一般情况下,MemoryMXBean.gc()只调用System.gc()。

<强> MemoryMXBean.gc()

  

void gc()运行垃圾收集器。调用gc()是有效的   相当于调用:System.gc()参见:System.gc()

http://docs.oracle.com/javase/7/docs/api/java/lang/management/MemoryMXBean.html

<强> System.gc()的

  

public static void gc()运行垃圾收集器。打电话给gc   方法建议Java虚拟机花费精力   回收未使用的对象,以便创建它们当前的内存   占用可快速重复使用。当控制从方法返回时   呼叫,Java虚拟机已尽最大努力回收空间   来自所有丢弃的物品。

     

调用System.gc()实际上等同于调用:

     

Runtime.getRuntime()。gc()参见:Runtime.gc()

http://docs.oracle.com/javase/7/docs/api/java/lang/System.html#gc()

<强> Runtime.gc()

  

public void gc()运行垃圾收集器。调用此方法   表明Java虚拟机花费在回收上   未使用的对象,以便使它们当前占用的内存   可快速重复使用。当控制从方法调用返回时,   虚拟机已尽最大努力回收所有丢弃的东西   对象。名称gc代表&#34;垃圾收集器&#34;。虚拟   机器根据需要自动执行此回收过程   单独的线程,即使没有显式调用gc方法。

     

方法System.gc()是传统而方便的方法   调用这个方法。

http://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html#gc()