在JAVA中,可以通过JMX接口管理、监控正在运行的程序。
可以通过JMX开放的功能,获取程序GC的情况,如下:
public class TestJMX {
public static void main(String[] args) {
List<GarbageCollectorMXBean> garbageCollectorMXBeanList = ManagementFactory.getGarbageCollectorMXBeans();
for (final GarbageCollectorMXBean garbageCollector : garbageCollectorMXBeanList) {
System.out.println("name:" + garbageCollector.getName());
System.out.println("CollectionCount:" + garbageCollector.getCollectionCount());
System.out.println("CollectionTime" + garbageCollector.getCollectionTime());
}
}
}
首先通过ManagementFactory.getGarbageCollectorMXBeans()
方法获取所有的GC场景。
其中比较重要的是,可以通过getCollectionTime
方法获取本次GC的耗时。
对于Young GC,整个过程都STW,可以认为方法返回的时间就是整个YGC的时间。
而对于老年代,一般使用CMS GC,在CMS过程中,有大量并发的过程,真正STW的阶段只有initial mark和remark阶段。
请问,对于CMS GC,getCollectionTime方法返回的时间是initial mark和remark阶段耗时之和么?