我想监控 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 和完整 gc。
有人有想法吗?
谢谢。
阿尔诺
我想监控 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 和完整 gc。
有人有想法吗?
谢谢。
阿尔诺
我对此并不完全确定,但我假设控制所有内存池的垃圾收集器(至少是旧代的那个)是用于主要 gc 的垃圾收集器。例如:我有一个使用这 2 个收集器运行的 JVM:
考虑到这一点,我会说,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”收集器(管理老一代池的那个)的情况下,只有当我在详细输出中获得完整的 GC 时,收集计数才会增加。我可能错了,也许在某些情况下这个收集器也执行次要 GC,但我需要运行更多测试才能完全确定这一点。请让我知道是否有人发现了其他内容,或者您对这个问题有一些更具体的信息,因为我对此很感兴趣。
它确实...查看名称,例如 ParNew、ConcurrentMarkSweep、.. 等。有些名称用于次要 gc,有些用于完整 gc,
正在寻找相同的信息,并在阅读https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html#BABFAFAE for JAVA 8 后发现一些收集器可用于两个次要的/full GC(例如 G1 或 SerialGC),但其他一些收集器仅用于次要或完整 GC(例如 ParNewGC、ConcMarkSweepGC)。
例如,当您使用 G1 时,使用的两个收集器的名称非常明确,而完整 gc 的一个是 G1 Old Generation。
但是,由于 MXBean 缺少关于次要或完整的信息,因此:
在我的情况下,我将只打印收集器名称以及时间和计数值,然后让读取这些数据的人进行分析。就我而言,数据将被绘制成图表(Grafana)
不确定最新的 JDK 是否改进了这一点……