我可以从jmx中检索GarbageCollectionMXBean
。但是,如何区分 major gc和 full gc?这是非官方的条款。如果老一代被清理,我将gc表示为 major 。并且 full 我指的是压缩(碎片整理)堆的gc。从实际角度看,当并发模式失败或程序员明确调用System.gs
是否可以用jmx区分这些事件?
答案 0 :(得分:1)
两个警告词:
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 - 作为不同JVM实现的示例,Zing不断压缩收集器:http://www.azulsystems.com/sites/default/files/images/c4_paper_acm.pdf