Ji *_*eng 11 java garbage-collection jvm
我启用了gc log -XX:+PrintTenuringDistribution.但我对下面的终身分配很困惑.
从我读到的内容,第一个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]
Run Code Online (Sandbox Code Playgroud)
编辑:
由于声称对象的竞争条件,这被证实是jvm本身的一个错误.
详细讨论可以在这里找到:
http://mail.openjdk.java.net/pipermail/hotspot-gc-use/2013-October/001635.html
关于OpenJDK邮件列表的讨论(hotspot-gc-use@openjdk.java.net)提出了这样的异常权属分布报告是由于每个年龄计数器的线程之间的竞争状态导致的。
错误JDK-8027363已填补。
错误摘录:
问题是:在将目标对象复制到幸存者空间或旧的gen中的代码中,多个线程可能会争夺一个对象。在对象的年龄低于使用期限阈值的情况下,或者如果较早的一代不是CMS,我们将首先复制对象,然后通过将转发指针交换到副本来声明该对象。其他副本将被丢弃,并且中奖线程将继续。问题在于,年龄表由所有竞争复制的线程递增。解决方法是,只有比赛的获胜者才应该增加年龄表,以避免多次增加。
您阅读的日志是正确的,问题在于您在 4 中指定的保有阈值。
\n\nThe GC parameter \xe2\x80\x9c-XX:MaxTenuringThreshold\xe2\x80\x9d defines how many minor GC cycles \nan object can stay in the survivor spaces until it finally gets tenured to the \nold space.\nRun Code Online (Sandbox Code Playgroud)\n\n因此,您可以从一次清理到下一次清理积累字节,因为根据您配置的保有阈值,您可以在许多 GC 轮次中将内存保留在特定年龄上。
\n\n例如,如果您想看到您期望看到的特定行为,请将阈值设置为0。
-XX:MaxTenuringThreshold=0\xe2\x80\x94Makes the full NewSize available to every NewGC cycle, \nand reduces the pause time by not evaluating tenured objects. Technically, \nthis setting promotes all live objects to the older generation, rather \nthan copying them\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
8644 次 |
| 最近记录: |