我检查了Java GC日志,但GC类型有些奇怪。我的测试应用程序使用这些JVM命令行GC选项在Java 8u121 x64上运行:
-XX:+UseSerialGC -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps
GC日志中有一个片段:
2017-09-05T22:16:44.677+0200: 1.581: [GC (Allocation Failure) 2017-09-05T22:16:44.678+0200: 1.581: [DefNew: 139765K->17429K(157248K), 0.0936400 secs] 362075K->361613K(506816K), 0.0937556 secs] [Times: user=0.08 sys=0.02, real=0.09 secs]
2017-09-05T22:16:45.177+0200: 2.081: [GC (Allocation Failure) 2017-09-05T22:16:45.177+0200: 2.081: [DefNew: 157184K->157184K(157248K), 0.0000394 secs]2017-09-05T22:16:45.177+0200: 2.081: [Tenured: 344183K->349561K(349568K), 0.0605620 secs] 501368K->500745K(506816K), [Metaspace: 2831K->2831K(1056768K)], 0.0607333 secs] [Times: user=0.06 sys=0.00, real=0.06 secs]
2017-09-05T22:16:45.239+0200: 2.142: [Full GC (Allocation Failure) 2017-09-05T22:16:45.239+0200: 2.142: [Tenured: 349561K->349547K(349568K), 0.0450676 secs] 506685K->506671K(506816K), [Metaspace: 2831K->2831K(1056768K)], 0.0451294 secs] [Times: user=0.05 sys=0.00, real=0.04 secs]
你可以看到第一行显然是一个带有DefNew收集器的小型GC。 我找到了一篇关于GC日志的文章here。 基于此,第二行是完整的GC。这似乎是正确的,因为它也收集了年轻一代甚至Metaspace。但是第三行发生了什么?这个日志条目说这是一个完整的GC。但它只收集了老一代。似乎日志条目是错误的:第二个是完整的gc,第三个是主要的gc。
所以问题是:为什么第3行的“完整GC”标题?
答案 0 :(得分:0)
第二行实际上是第三行报告的集合的一部分。如果您使用-XX:+PrintGC
,则仅报告为Full GC。
gc日志记录将在JDK9中统一 - 请参阅例如this comparison,解释了这些记录st