我需要找到一种方法来获取或计算GC暂停时间,就像使用-XX:+PrintGCDetails
时出现的时间一样:
[GC [PSYoungGen: 129536K->20978K(150528K)] 129536K->92722K(492544K), 0.1067600 secs] [Times: user=0.18 sys=0.08, real=0.10 secs]
[GC [PSYoungGen: 145214K->20987K(280064K)] 216958K->213054K(622080K), 0.1758780 secs] [Times: user=0.36 sys=0.10, real=0.17 secs]
[GC [PSYoungGen: 280059K->20976K(280064K)] 472126K->412607K(674304K), 0.1969610 secs] [Times: user=0.52 sys=0.11, real=0.20 secs]
[Full GC [PSYoungGen: 20976K->5608K(280064K)] [ParOldGen: 391631K->393789K(841728K)] 412607K->399398K(1121792K) [PSPermGen: 4370K->4369K(21504K)], 2.0758810 secs] [Times: user=6.38 sys=0.03, real=2.08 secs]
我尝试使用ManagementFactory.getGarbageCollectorMXBeans()
列表并使用getCollectionTime()
方法,但它会为 Scavenge GC和 MarkSweep GC生成累计挂钟时间。
Iterator beans = ManagementFactory.getGarbageCollectorMXBeans().iterator();
while (beans.hasNext()) {
GarbageCollectorMXBean bean = (GarbageCollectorMXBean) beans.next();
System.out.println("Name: " + bean.getName());
System.out.println("Time: " + bean.getCollectionTime() + "ms");
}
结果:
Name: PS Scavenge
Time: 487ms
Name: PS MarkSweep
Time: 3993ms
Name: PS Scavenge
Time: 487ms
Name: PS MarkSweep
Time: 3993ms
Name: PS Scavenge
Time: 487ms
Name: PS MarkSweep
Time: 3993ms
Name: PS Scavenge
Time: 487ms
Name: PS MarkSweep
Time: 3993ms
Name: PS Scavenge
Time: 487ms
Name: PS MarkSweep
Time: 3993ms
Name: PS Scavenge
Time: 487ms
Name: PS MarkSweep
Time: 3993ms
.
.
.
Name: PS MarkSweep
Time: 6233ms
Name: PS Scavenge
Time: 5656ms
Name: PS MarkSweep
Time: 6233ms
Name: PS Scavenge
Time: 5656ms
Name: PS MarkSweep
Time: 6233ms
Name: PS Scavenge
Time: 5656ms
Name: PS MarkSweep
Time: 6233ms
[GC [PSYoungGen: 1163264K->931840K(1242624K)] 2989743K- >2990439K(3625984K), 2.4818040 secs] [Times: user=19.02 sys=0.35, real=2.48 secs]
[Full GC [PSYoungGen: 931840K->523250K(1242624K)] [ParOldGen: 2058599K->2382949K(3540480K)] 2990439K->2906199K(4783104K) [PSPermGen: 4338K->4338K(21504K)], 6.6675530 secs] [Times: user=38.70 sys=0.14, real=6.67 secs]
Name: PS Scavenge
Time: 8137ms
Name: PS MarkSweep
Time: 12900ms
Name: PS Scavenge
Time: 8137ms
我知道当GC开始工作时,它会造成世界各地的停止,但我需要知道在完全GC停止世界之前GC产生的暂停时间。
有没有办法抓住它?
答案 0 :(得分:1)
有一个特定于热点的API提供GC通知,包括每个GC的时间信息:com.sun.management.GarbageCollectionNotificationInfo
您必须检测其可用性以确保与其他JVM的兼容性。
答案 1 :(得分:0)
最简单的方法是使用
-XX:+PrintGCApplicationStoppedTime
尽管名称包括JVM检测到的所有触发器。您可以忽略那些非常小并且与GC无关的apuses。