2011-01-08 119 views
7

我想监视JMX中的完整GC频率。 MBean暴露GC计数。 (参考http://download.oracle.com/javase/1.5.0/docs/api/java/lang/management/GarbageCollectorMXBean.html - java.lang:type = GarbageCollector,name =)。是否可以在JMX(HotSpot)上监控“Full GC”频率?

问题是MBean并未区分次要和完全gc。

有人有想法吗?

谢谢。

Arnault

+1

您可能会发现gc之前/之后的旧版使用情况只会在完整gc时下降。如果这是你的情况,那么这将足以识别完整的GC。 – Ron 2011-02-02 16:42:31

+0

[这可能会给你一些见解](https://gist.github.com/khotyn/1520947)在你测试你的代码的JVM上启用了哪种GC类型 – KJ50 2014-08-25 23:37:06

回答

0

它确实...看起来像名称ParNew,ConcurrentMarkSweep,..等 一些名称是为小gc,一些为全gc,

+0

对不起,但不完全。 ParNew和ConcurrentMarkSweep是GC算法的实现,对于那些GC你可以有小的或主要的集合。 – ajeanson 2011-01-21 06:54:07

8

我不完全确定这一点,但我认为,控制所有内存池的垃圾回收器(至少一个用于老一代)是用于主要gc的一个。例如:我有JVM与这些2个收集器运行:

  • PS MarkSweep
    • MemoryPoolNames:PS伊甸空间,PS幸存者空间,PS旧根,PS彼尔姆根
    • CollectionCount:68
  • PS扫气
    • MemoryPoolNames:PS伊甸园空间,PS生存空间
    • CollectionCount:2690

考虑到这一点,我会说,PS扫气用于较小的GC和PS MarkSweep重大GC。

UPDATE(基于@ajeanson评论,感谢您的反馈BTW):

实际上,我摆在那里的例子来自于我所用的JVM的MXBean的公开的信息中取得。如您所述,这些是GC算法,GC的MXBean所使用的名称是基于GC正在使用的算法。我一直在寻找更多关于这方面的信息;本文http://download.oracle.com/javase/6/docs/technotes/guides/management/jconsole.html中,读取以下:

虽然Java HotSpot VM定义了两个 一代:年轻一代 (有时称为“托儿所”)和 老一代。年轻的 一代包括一个“伊甸园空间” 和两个“幸存者空间”。 VM 最初将所有对象分配给Eden空间,并且大多数对象在那里死亡 。当它执行次要GC时,VM将任何剩余的对象 从Eden空间移动到 幸存空间之一。虚拟机移动对象 ,该对象在活着的 空间中足够长的时间移动到 老一代的“终身”空间。当终身 代填满时,有一个完整的GC,通常要慢得多,因为它涉及所有活动对象。 永久代持有虚拟机 本身的所有反射数据,如类和方法 对象。

考虑看看上的MXBean的collectionCount财产,在我的“PS MarkSweep”收集器的情况下(在一个管理的老一代池),集数,似乎当我得到一个完整的GC只增加在详细输出中。我可能是错的,也许在某些情况下,这个收集器也会执行较小的GC,但我需要运行更多的测试才能完全确定这一点。 请让我知道是否有人发现了别的东西,或者您对这个问题有更多具体的信息,因为我对它很感兴趣。