12

で gc ログを有効にしてい-XX:+PrintTenuringDistributionます。しかし、私は以下の在職期間の分布とかなり混乱しています。

私が読んだことから、最初の gc の年齢 1 (1 GC から生き残った) には 10532656 バイトがあります。2 番目の gc では、年齢 2 で 9178824 バイト (2 つの GC から存続)。1 回目と 2 回目の GC の間に一部のオブジェクトが停止したため、これは問題ありません。

しかし、2 番目の 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

4

2 に答える 2

5

OpenJDK メーリング リスト (hotspot-gc-use@openjdk.java.net) での議論は、そのような異常な在職期間分布レポートが、エイジ カウンターごとにアンデートするスレッド間の競合状態の結果であることを示唆しています。

バグJDK-8027363が埋められました。

バグからの抜粋:

問題は次のとおりです。ターゲット オブジェクトを Survivor 領域または古い世代にコピーするためのコードでは、複数のスレッドが競合してオブジェクトを要求する可能性があります。オブジェクトの年齢が保有期間のしきい値を下回っている場合、または古い世代が CMS でない場合は、最初にオブジェクトをコピーしてから、転送ポインタをコピーにスワップすることでオブジェクトを要求します。他のコピーは破棄され、勝ったスレッドが続行されます。問題は、コピーを行うために競合するすべてのスレッドによって age テーブルがインクリメントされることです。修正は、複数のインクリメントを回避するために、レースの勝者のみが age テーブルをインクリメントする必要があることです。

于 2013-10-31T02:02:57.930 に答える