分析gc日志

时间:2015-04-16 05:30:27

标签: java garbage-collection jvm jvm-hotspot verbosegc

我正在使用-XX:+PrintGCApplicationStoppedTime-XX:+PrintGCApplicationConcurrentTime选项打开gc日志记录。

但发现只有经过PrintGCApplicationStoppedTime -XX:+PrintGCDetails打印{g}日志的4 {0} 5张后才能打印出来!

根据定义PrintGCApplicationStoppedTime打印每个gc的应用程序停止时间。

但我不清楚为什么它会像下面显示的例子那样打印。

是因为

PrintGCApplicationStoppedTime只需在每个安全点到达后打印

(或)

日志文件将由不同的gc线程记录。 我使用Concurrent扫描完整的GC和年轻一代的ParNew

我的应用程序是网络应用程序。

O / p Pattern-我是这样的:

Application time: 0.3847031 seconds
Total time for which application threads were stopped: 0.3135419 seconds
Application time: 0.1520723 seconds
Total time for which application threads were stopped: 0.1993920 seconds
Application time: 0.1188219 seconds
Total time for which application threads were stopped: 0.1993920 seconds
Application time: 0.1188219 seconds
Total time for which application threads were stopped: 0.1993920 seconds
Application time: 0.1188219 seconds
Total time for which application threads were stopped: 0.1993920 seconds
Application time: 0.1188219 seconds
1.229: [GC 1.229: [ParNew: 256000K->51200K(256000K), 0.1509756 secs] 426536K->334728K(997376K), 0.1510198 secs] [Times: user=0.85 sys=0.07, real=0.15 secs]

1 个答案:

答案 0 :(得分:9)

不幸的是PrintGCApplicationStoppedTime是这个JVM选项的误导性名称。

实际上它会打印安全点内部所花费的时间。安全点暂停不仅仅是由于垃圾收集,还有许多其他原因:

  • 去最佳化
  • 偏向锁撤销
  • 线程转储
  • 堆检查
  • 班级重新定义
  • 等。 (see the list)

即使没有请求的VM操作,安全点也可能会定期发生,以便对空闲监视器进行放气,执行某些JIT清理等等。 请参阅-XX:GuaranteedSafepointInterval VM选项(默认为1000毫秒)。

使用-XX:+PrintSafepointStatistics -XX:PrintSafepointStatisticsCount=1转储有关安全点的更多信息。