当我在VisualVM中研究我的应用程序的行为时,我遇到了这个并且感到困惑,我认为执行垃圾收集的JMX调用与调用System.gc()
具有相同的功能,但是在所有环境中我都是尝试过它,JMX调用总是导致较小的堆使用量,然后调用System.gc()
,功能上有什么不同?
你可以看到最后一滴 - 我手动点击了执行GC按钮,我的使用率下降了一点,然后是常规系统集合。关于为什么会这样的想法?
我在多个环境中尝试了这个,将集合留给系统并手动调用System.gc()
,每次JMX调用都会清除更多。
正如您在发布的图片中看到的,系统垃圾收集正在运行,JMX调用只是清除了更多,问题是这两个调用之间有什么区别?
答案 0 :(得分:5)
这必须是间接的(由于它在程序执行中的不同点或类似因素被调用) - Sun对MemoryMXBean
,sun.management.MemoryImpl
的实现:
public void gc() {
Runtime.getRuntime().gc();
}
System.gc()
:
public static void gc() {
Runtime.getRuntime().gc();
}
因此,建议垃圾收集的两种方式之间确实没有功能差异,唯一的区别在于它何时以及从什么线程调用它。
答案 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()