是否可以在JMX中监控"Full GC"频率(在HotSpot上)?

aje*_*son 7 monitoring garbage-collection jvm jmx jvm-hotspot

我想在JMX中监控Full GC频率.MBean暴露GC计数.(参见http://download.oracle.com/javase/1.5.0/docs/api/java/lang/management/GarbageCollectorMXBean.html - java.lang:type = GarbageCollector,name =).

问题是MBean不区分次要和完整的gc.

有人有想法吗?

谢谢.

阿尔诺

Got*_*txi 8

我不完全确定这一点,但我认为控制所有内存池的垃圾收集器(至少是Old Gen的一个)是用于主要gc的垃圾收集器.例如:我有一个运行这两个收集器的JVM:

  • PS MarkSweep
    • MemoryPoolNames:PS Eden Space,PS Survivor Space,PS Old Gen,PS Perm Gen
    • CollectionCount:68
  • PS清除
    • MemoryPoolNames:PS Eden Space,PS Survivor Space
    • CollectionCount:2690

考虑到这一点我会说,PS Scavenge用于较小的gc和PS MarkSweep用于主要的gc.

更新(根据@ajeanson评论,感谢您的反馈顺便说一下):

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

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

看一下MXBeans上的collectionCount属性,对于我的"PS MarkSweep"收集器(管理Old Generation池的收集器),只有当我在详细输出中得到一个完整的GC时,收集计数似乎才会增加.我可能错了,也许在某些情况下,这个收集器也执行了较小的GC,但我需要运行更多测试才能完全确定.如果有人发现其他内容或者您有关于此问题的更具体信息,请告诉我,因为我对它很感兴趣.


小智 0

它确实...看看名称,例如 ParNew、ConcurrentMarkSweep 等。有些名称用于次要GC,有些名称用于完整GC,