9

我想监控 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。

有人有想法吗?

谢谢。

阿尔诺

4

3 回答 3

9

我对此并不完全确定,但我假设控制所有内存池的垃圾收集器(至少是旧代的那个)是用于主要 gc 的垃圾收集器。例如:我有一个使用这 2 个收集器运行的 JVM:

  • PS MarkSweep
    • MemoryPoolNames:PS Eden Space、PS Survivor Space、PS Old Gen、PS Perm Gen
    • 收藏数量:68
  • PS清除
    • MemoryPoolNames:PS Eden Space、PS Survivor Space
    • 收藏数量: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”收集器(管理老一代池的那个)的情况下,只有当我在详细输出中获得完整的 GC 时,收集计数才会增加。我可能错了,也许在某些情况下这个收集器也执行次要 GC,但我需要运行更多测试才能完全确定这一点。请让我知道是否有人发现了其他内容,或者您​​对这个问题有一些更具体的信息,因为我对此很感兴趣。

于 2011-02-02T16:39:06.677 回答
0

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

于 2011-01-20T08:37:41.743 回答
0

正在寻找相同的信息,并在阅读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 缺少关于次要或完整的信息,因此:

  • 您知道您的应用程序正在使用的 GC 并相应地编码您的监控方法知道收集器名称
  • 或者您开始​​拥有所选 JVM 版本的所有可能性的地图

在我的情况下,我将只打印收集器名称以及时间和计数值,然后让读取这些数据的人进行分析。就我而言,数据将被绘制成图表(Grafana)

不确定最新的 JDK 是否改进了这一点……

于 2020-12-11T14:48:04.493 回答