2

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

但是发现只有经过4 0r 5 打印了我通过命令PrintGCApplicationStoppedTime打印的gc日志的实际细节!-XX:+PrintGCDetails

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

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

是不是因为

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

(或者)

日志文件将由不同的 gc 线程记录。我对全 GC 使用并发扫描,对年轻一代使用 ParNew

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

O/p 模式——我是这样的:

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]
4

1 回答 1

14

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

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

  • 去优化
  • 偏向锁撤销
  • 线程转储
  • 堆检查
  • 类重新定义
  • (见列表)

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

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

于 2015-04-16T11:38:07.427 回答