【问题标题】:Is it possible to monitor gc compactification with jmx?是否可以使用 jmx 监控 gc 压缩?
【发布时间】:2017-06-09 23:12:10
【问题描述】:

我可以从 jmx 检索 GarbageCollectionMXBean。但是我如何区分 major gc 和 full gc?那是非官方的术语。如果清理了旧代,我将 gc 表示为 majorfull 我的意思是 gc 压缩(碎片整理)堆。从实际的角度来看,当并发模式失败或程序员显式调用System.gs时会发生完整的gc

是否可以用jmx区分此类事件?

【问题讨论】:

  • 可以通过JMX获取GC原因,见the example。通常 CMS 循环会有 "No GC" 原因。显式 GC 会有 "System.gc" 原因,并发模式失败通常会以 "ConcurrentMarkSweep - Allocation Failure" 原因结束。这足够了吗?还是您正在寻找其他东西?
  • 非常接近。事实上,我已经找到了这个通知描述,并忙于编写示例代理来收集统计数据并找到“gcAction”、“gcCause”和 gc 行为之间的相关性。

标签: java garbage-collection jvm jmx


【解决方案1】:

两句警告:

  • 请注意,您定义的“主要”gc 不一定排除压缩(例如,G1GC 在主要循环上执行增量压缩)。因此,您将“主要”与“完整”事件区分开来的问题不同于“压缩”与“非压缩”事件。我知道您对后者更感兴趣,但请告诉我其他情况。
  • 有关收集器的详细信息是 JVM 特定的。我会回答 HotSpot,但这可能不适用于其他实现。

AFAIK,JMX bean 中没有提供关于压缩和非压缩事件的数据。 JMX 确实提供(在 java.lang:type=GarbageCollector 内)关于每个收集器的统计信息,因此了解每个收集器阶段的一些详细信息,您可以对压缩事件做出合理的推断。

例如,ConcurrentMarkSweep 收集器 (-XX:+UseConcMarkSweepGC) 不会压缩(因此,您不能使用这些事件)。但是,当 CMS 无法释放足够的空间(通常是由于碎片)时,它将为下一个事件安排 MarkSweepCompact。这些事件将是一个压缩事件,我相信它们应该出现在 java.lang:name=MarkSweepCompact,type=GarbageCollector) 下。

G1GC(Java 8 的默认设置)在每个事件中执行增量压缩,因此我不确定 GC 事件是否特别有用。

Parallel收集器压缩老年代,正确的MBean应该是java.lang:type=GarbageCollector,name=PS MarkSweep。

有用的文档: - HotSpot GC 文档 (java8):https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/index.html - 快速参考。大多数收藏家(但老了)https://blogs.oracle.com/jonthecollector/our-collectors - Zing 的持续压缩收集器作为不同 JVM 实现的示例:http://www.azulsystems.com/sites/default/files/images/c4_paper_acm.pdf

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多