java - 分析gc日志

标签 java garbage-collection jvm jvm-hotspot verbosegc

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

但发现只有在 PrintGCApplicationStoppedTime 打印 4 0r 5 次后,我通过 -XX:+PrintGCDetails 命令打印了 gc 日志的实际详细信息!

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

但我不清楚为什么它打印如下所示的示例。

是因为

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

(或)

日志文件会被不同的gc线程记录。 我对年轻一代使用 Full 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]

最佳答案

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

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

  • 去优化
  • 偏向锁撤销
  • 线程转储
  • 堆检查
  • 类重定义
  • (see the list)

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

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

关于java - 分析gc日志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29666057/

相关文章:

java - Jackson 无法反序列化通过 REST 传递的 MongoDB 对象

java - 如何在 Android 中打印本地化的单字符日期名称?

node.js - 在高负载下,Node.js 的可伸缩性是否会因为垃圾收集而受到影响?

java - 了解 Java 内存管理

java - Full GC 频繁发生

java - Controller 中的 Spring MVC URL 映射 对于动态 URL

java - 如何在 InputStream 中接收多个文件并进行相应处理?

Lua 5.1 相当于 lua_setgcthreshold

garbage-collection - Go 使用什么样的垃圾收集器?

java - 如何计算在java中执行的字节码数