如何阅读+ PrintTenuringDistribution的输出

时间:2013-10-24 06:19:08

标签: java garbage-collection jvm

我已使用-XX:+PrintTenuringDistribution启用了gc日志。但是我对下面的终身分配很困惑。

从我读到的内容,第一个gc中的1岁时有10532656个字节(从1个GC中幸存下来)。在第二个gc中,2岁时为9178824个字节(从2个GC中幸存下来)。这很好,因为一些物体在第一个和第二个GC之间死亡。

但是在第二个GC中,16101552字节在3岁时,而在第一个GC中,2岁时只有14082976个字节。我不知道这个数字在增加的原因。年龄n中的所有字节都不应该来自之前GC中的年龄n-1吗?或者我误解了这些数字?

感谢。

2013-10-19T19:46:30.244+0800: 169797.045: [GC2013-10-19T19:46:30.244+0800: 169797.045: [ParNew
Desired survivor size 87359488 bytes, new threshold 4 (max 4)
- age   1:   10532656 bytes,   10532656 total
- age   2:   14082976 bytes,   24615632 total
- age   3:   15155296 bytes,   39770928 total
- age   4:   13938272 bytes,   53709200 total
: 758515K->76697K(853376K), 0.0748620 secs] 4693076K->4021899K(6120832K), 0.0756370 secs] [Times: user=0.42 sys=0.00, real=0.07 secs]
2013-10-19T19:47:10.909+0800: 169837.710: [GC2013-10-19T19:47:10.909+0800: 169837.711: [ParNew
Desired survivor size 87359488 bytes, new threshold 4 (max 4)
- age   1:    9167144 bytes,    9167144 total
- age   2:    9178824 bytes,   18345968 total
- age   3:   16101552 bytes,   34447520 total
- age   4:   21369776 bytes,   55817296 total
: 759449K->63442K(853376K), 0.0776450 secs] 4704651K->4020310K(6120832K), 0.0783500 secs] [Times: user=0.43 sys=0.00, real=0.07 secs]

编辑:

由于声称对象的竞争条件,这已经被证实是jvm本身的一个错误。

详细讨论可以在这里找到:

http://mail.openjdk.java.net/pipermail/hotspot-gc-use/2013-October/001635.html

2 个答案:

答案 0 :(得分:4)

关于OpenJDK邮件列表(hotspot-gc-use@openjdk.java.net)的讨论表明,这种异常的权属分配报告是由于每个年龄计数器的线程之间的竞争条件造成的。

错误JDK-8027363已被填充。

摘自错误:

  

问题在于:在将目标对象复制到幸存者空间或旧版本中的代码中,有几个线程可能会竞争声明一个对象。在对象的年龄低于终点阈值的情况下,或者如果老一代不是CMS,我们将首先复制对象,然后通过将转发指针交换到副本来声明对象。其他副本将被丢弃,获胜线程将继续。问题是年龄表由竞争进行复制的所有线程增加。修复是只有比赛的获胜者应该增加年龄表以避免多次增量。

答案 1 :(得分:2)

您正在阅读正确的日志,问题在于您在4上指定的终身临界阈值。

The GC parameter “-XX:MaxTenuringThreshold” defines how many minor GC cycles 
an object can stay in the survivor spaces until it finally gets tenured to the 
old space.

因此,您可以从一个清除到下一个清除累积字节,因为根据您配置的期限阈值,您可以在特定年龄内为许多GC轮次设置内存。

例如,如果您想要查看您希望看到的特定行为,请在0上设置阈值。

-XX:MaxTenuringThreshold=0—Makes the full NewSize available to every NewGC cycle, 
and reduces the pause time by not evaluating tenured objects. Technically, 
this setting promotes all live objects to the older generation, rather 
than copying them