Contenu connexe
Similaire à Concurrent Mark-Sweep Garbage Collection #jjug_ccc (20)
Concurrent Mark-Sweep Garbage Collection #jjug_ccc
- 8. CMS GC 概要
CMS GC 概要
Concurrent Mark-Sweep GC
HotSpot VM の CMS GC
GC ログの読み方
注意すべきパターン
8
- 11. Concurrent Mark-Sweep GC
1. ゴミじゃない領域を Mark し、
2. Sweep して再利用可能にする
ヒープ領域
FreeList
✔ ✔ ✔ ✔
←再利用時に辿る(コンパクションなし)
Thread stack JNI Reference …
Root
11
- 12. CMS GC 概要
CMS GC 概要
Concurrent Mark-Sweep GC
HotSpot VM の CMS GC
GC ログの読み方
注意すべきパターン
12
- 15. 世代別 GC (CMS GC利用時)
•Minor GC: Parallel Copy GC
•アプリケーションを止める
(別名 Stop-The-World, STW)
•早い・メモリが断片化しない
•Major GC: CMS GC
•一部アプリケーションを止める
•コンパクションしないので断片化する
15
- 21. Minor GC + Promotion
Eden
Survivor
1
Survivor
0
Tenured
Perm
/
Meta
space
21
New領域 Old領域
age++
- 22. Minor GC + Promotion
Eden
Survivor
1
Survivor
0
Tenured
Perm
/
Meta
space
22
New領域 Old領域
age++
promotion
- 23. Minor GC + Promotion
Eden
Survivor
1
Survivor
0
Tenured
Perm
/
Meta
space
age++
promotion
23
• 最大で -XX:+MaxTenuringThreshold 以上 Survivor 間を移動
• Eden から Survivor へ移動ができない
promotion 条件
- 24. Minor GC + Promotion
Eden
Survivor
1
Survivor
0
Tenured
Perm
/
Meta
space
age++
promotion
24
• 最大で -XX:+MaxTenuringThreshold 以上 Survivor 間を移動
• Eden から Survivor へ移動ができない
promotion 条件 -XX:+AlwaysTenureで Survivor スルー
- 25. Minor GC + Promotion 後
Eden
Survivor
1
Survivor
0
Tenured
Perm
/
Meta
space
25
New領域 Old領域
- 27. Major GC (CMS GC)
Eden
Survivor
1
Survivor
0
Tenured
Perm
/
Meta
space
27
GC 対象
- 28. Major GC (CMS GC)
Eden
Survivor
1
Survivor
0
Tenured
Perm
/
Meta
space
• -XX:CMSInitiatingOccupancyFraction (92%)
• その他、ヒープ占有速度の統計判断など
発生条件
28
GC 対象
- 29. Major GC (CMS GC)
Eden
Survivor
1
Survivor
0
Tenured
Perm
/
Meta
space
• -XX:CMSInitiatingOccupancyFraction (92%)
• その他、ヒープ占有速度の統計判断など
発生条件
29
-XX:+UseCMSInitiatingOccupancyOnly
を設定するとこの条件のみで判断する
GC 対象
- 30. Major GC (CMS フェーズ)
1. Initial mark
2. Concurrent mark
3. Concurrent preclean
4. Concurrent abortable preclean
5. Remark (Final mark)
6. Concurrent sweep
7. Concurrent reset
Mark
Sweep
後始末
30
- 31. Major GC (CMS フェーズ)
1. Initial mark
2. Concurrent mark
3. Concurrent preclean
4. Concurrent abortable preclean
5. Remark (Final mark)
6. Concurrent sweep
7. Concurrent reset
Mark
Sweep
後始末
31
STW
STW
Concurrent が付いている
フェーズはアプリと同時に
動作するが、付いてない
フェーズは STW が発生する
- 32. Major GC (CMS GC) 後
Eden
Survivor
1
Survivor
0
Tenured
Perm
/
Meta
space
32
New領域 Old領域
- 33. Major GC (CMS GC) 後
Eden
Survivor
1
Survivor
0
Tenured
Perm
/
Meta
space
CMS GC は安定している?
いいえ、失敗して STW を伴う
Full GC が発生する場合もあります
33
New領域 Old領域
CMS GC とは別アルゴリズム
(Mark-Sweep-Compact, 断片化しない)
- 34. Full GC (with STW)
Eden
Survivor
1
Survivor
0
Tenured
Perm
/
Meta
space
GC 対象
34
- 35. Full GC (with STW)
Eden
Survivor
1
Survivor
0
Tenured
Perm
/
Meta
space
GC 対象
35
• 断片化で割り当てられない (promotion failed)
• 回収が間に合わない (concurrent mode failure)
発生条件
- 37. GC ログの読み方
CMS GC 概要
Concurrent Mark-Sweep GC
HotSpot VM の CMS GC
GC ログの読み方
注意すべきパターン
37
- 38. Java 起動オプション
•CMS GC を使う、
•-XX:+UseConcMarkSweepGC
•-XX:+CMSClassUnloadingEnabled (推奨)
•ログ (GC, ヒープダンプ)
•-Xloggc:gc.log
•-XX:+PrintGCDetails
•-XX:+PrintGCDateStamps
•-XX:+HeapDumpOnOutOfMemoryError
GC時にクラスを
アンロードする
OOME発生時
38
JDK8 からデフォルト true
- 40. Minor GC
•617423.912: [GC617423.912: [ParNew:
230016K->4553K(306688K), 0.0159800
secs] 2993210K->2774025K(4160256K),
0.0161510 secs] [Times: user=0.06
sys=0.00, real=0.01 secs]
40
- 41. Minor GC
•617423.912: [GC
617423.912: [ParNew:
230016K->4553K(306688K),
0.0159800 secs]
2993210K->2774025K(4160256K),
0.0161510 secs]
[Times: user=0.06 sys=0.00, real=0.01 secs]
41
見やすく整形
- 42. Minor GC
•617423.912: [GC
617423.912: [ParNew:
230016K->4553K(306688K),
0.0159800 secs]
2993210K->2774025K(4160256K),
0.0161510 secs]
[Times: user=0.06 sys=0.00, real=0.01 secs]
42
GC共通部分
Minor GC
time(1)相当 (全体の処理時間は real の値を見るのが良い)
処理時間(STW)
- 43. Minor GC (Minor GC)
•617423.912: [GC
617423.912: [ParNew:
230016K->4553K(306688K),
0.0159800 secs]
2993210K->2774025K(4160256K),
0.0161510 secs]
[Times: user=0.06 sys=0.00, real=0.01 secs]
43
Minor GC
- 44. Minor GC (Minor GC)
•617423.912: [GC
617423.912: [ParNew:
230016K->4553K(306688K),
0.0159800 secs]
2993210K->2774025K(4160256K),
0.0161510 secs]
[Times: user=0.06 sys=0.00, real=0.01 secs]
44
開始時刻
処理時間
New領域のサイズ
GC前 GC後 総容量
- 45. Minor GC (GC共通部分)
•617423.912: [GC
617423.912: [ParNew:
230016K->4553K(306688K),
0.0159800 secs]
2993210K->2774025K(4160256K),
0.0161510 secs]
[Times: user=0.06 sys=0.00, real=0.01 secs]
45
GC共通部分
- 46. Minor GC (GC共通部分)
•617423.912: [GC
617423.912: [ParNew:
230016K->4553K(306688K),
0.0159800 secs]
2993210K->2774025K(4160256K),
0.0161510 secs]
[Times: user=0.06 sys=0.00, real=0.01 secs]
46
開始時刻
処理時間
GC前 GC後 総容量
ヒープ全体のサイズ
- 47. Minor GC (promotion)
•617423.912: [GC
617423.912: [ParNew:
230016K->4553K(306688K),
0.0159800 secs]
2993210K->2774025K(4160256K),
0.0161510 secs]
[Times: user=0.06 sys=0.00, real=0.01 secs]
47
Old領域に移った
サイズの求め方
- 48. Minor GC (promotion)
•617423.912: [GC
617423.912: [ParNew:
230016K->4553K(306688K),
0.0159800 secs]
2993210K->2774025K(4160256K),
0.0161510 secs]
[Times: user=0.06 sys=0.00, real=0.01 secs]
48
New領域の差分 全体の差分
promoted = (230016-4553) - (2993210-2774025)
= 6278K Old領域へ promote
Old領域に移った
サイズの求め方
- 49. CMS GC
• 2014-09-01T12:39:09.310+0900: 617423.929: [GC [1 CMS-initial-mark: 2925342K(3853568K)] 2937899K(4160256K), 0.0098890 secs] [Times: user=0.00
sys=0.00, real=0.01 secs]
• 2014-09-01T12:39:09.320+0900: 617423.939: [CMS-concurrent-mark-start]
• 2014-09-01T12:39:09.772+0900: 617424.391: [CMS-concurrent-mark: 0.454/0.454 secs] [Times: user=1.38 sys=0.00, real=0.45 secs]
• 2014-09-01T12:39:09.772+0900: 617424.391: [CMS-concurrent-preclean-start]
• 2014-09-01T12:39:09.789+0900: 617424.408: [CMS-concurrent-preclean: 0.016/0.017 secs] [Times: user=0.05 sys=0.00, real=0.01 secs]
• 2014-09-01T12:39:09.789+0900: 617424.408: [CMS-concurrent-abortable-preclean-start]
• CMS: abort preclean due to time 2014-09-01T12:39:14.863+0900: 617429.482: [CMS-concurrent-abortable-preclean: 1.807/5.074 secs] [Times:
user=3.82 sys=0.03, real=5.08 secs]
• 2014-09-01T12:39:14.864+0900: 617429.484: [GC[YG occupancy: 54721 K (306688 K)]2014-09-01T12:39:14.864+0900: 617429.484: [Rescan (parallel) ,
0.0256580 secs]2014-09-01T12:39:14.890+0900: 617429.509: [weak refs processing, 0.0245990 secs]2014-09-01T12:39:14.915+0900: 617429.534:
[class unloading, 0.0403370 secs]2014-09-01T12:39:14.955+0900: 617429.574: [scrub symbol table, 0.0197600 secs]2014-09-01T12:39:14.975+0900:
617429.594: [scrub string table, 0.0044930 secs] [1 CMS-remark: 2925342K(3853568K)] 2980064K(4160256K), 0.1238550 secs] [Times: user=0.20
sys=0.00, real=0.12 secs]
• 2014-09-01T12:39:14.990+0900: 617429.609: [CMS-concurrent-sweep-start]
• 2014-09-01T12:39:17.724+0900: 617432.343: [CMS-concurrent-sweep: 2.734/2.734 secs] [Times: user=3.02 sys=0.03, real=2.74 secs]
• 2014-09-01T12:39:17.724+0900: 617432.343: [CMS-concurrent-reset-start]
• 2014-09-01T12:39:17.732+0900: 617432.352: [CMS-concurrent-reset: 0.008/0.008 secs] [Times: user=0.01 sys=0.00, real=0.01 secs]
49
- 50. CMS GC
• 2014-09-01T12:39:09.310+0900: 617423.929: [GC [1 CMS-initial-mark: 2925342K(3853568K)] 2937899K(4160256K), 0.0098890 secs] [Times: user=0.00
sys=0.00, real=0.01 secs]
• 2014-09-01T12:39:09.320+0900: 617423.939: [CMS-concurrent-mark-start]
• 2014-09-01T12:39:09.772+0900: 617424.391: [CMS-concurrent-mark: 0.454/0.454 secs] [Times: user=1.38 sys=0.00, real=0.45 secs]
• 2014-09-01T12:39:09.772+0900: 617424.391: [CMS-concurrent-preclean-start]
• 2014-09-01T12:39:09.789+0900: 617424.408: [CMS-concurrent-preclean: 0.016/0.017 secs] [Times: user=0.05 sys=0.00, real=0.01 secs]
• 2014-09-01T12:39:09.789+0900: 617424.408: [CMS-concurrent-abortable-preclean-start]
• CMS: abort preclean due to time 2014-09-01T12:39:14.863+0900: 617429.482: [CMS-concurrent-abortable-preclean: 1.807/5.074 secs] [Times:
user=3.82 sys=0.03, real=5.08 secs]
• 2014-09-01T12:39:14.864+0900: 617429.484: [GC[YG occupancy: 54721 K (306688 K)]2014-09-01T12:39:14.864+0900: 617429.484: [Rescan (parallel) ,
0.0256580 secs]2014-09-01T12:39:14.890+0900: 617429.509: [weak refs processing, 0.0245990 secs]2014-09-01T12:39:14.915+0900: 617429.534:
[class unloading, 0.0403370 secs]2014-09-01T12:39:14.955+0900: 617429.574: [scrub symbol table, 0.0197600 secs]2014-09-01T12:39:14.975+0900:
617429.594: [scrub string table, 0.0044930 secs] [1 CMS-remark: 2925342K(3853568K)] 2980064K(4160256K), 0.1238550 secs] [Times: user=0.20
sys=0.00, real=0.12 secs]
• 2014-09-01T12:39:14.990+0900: 617429.609: [CMS-concurrent-sweep-start]
• 2014-09-01T12:39:17.724+0900: 617432.343: [CMS-concurrent-sweep: 2.734/2.734 secs] [Times: user=3.02 sys=0.03, real=2.74 secs]
• 2014-09-01T12:39:17.724+0900: 617432.343: [CMS-concurrent-reset-start]
• 2014-09-01T12:39:17.732+0900: 617432.352: [CMS-concurrent-reset: 0.008/0.008 secs] [Times: user=0.01 sys=0.00, real=0.01 secs]
50
冗長なので、以降はタ
イムスタンプを省略
- 51. CMS フェーズ
1. Initial mark
2. Concurrent mark
3. Concurrent preclean
4. Concurrent abortable preclean
5. Remark (Final mark)
6. Concurrent sweep
7. Concurrent reset
Mark
Sweep
後始末
51
Initial mark Concurrent mark Concurrent preclean Remark Concurrent sweep Concurrent reset
再掲
- 52. Initial mark
•[GC [1 CMS-initial-mark:
2925342K(3853568K)] 2937899K(4160256K),
0.0098890 secs] [Times: user=0.00 sys=0.00,
real=0.01 secs]
•Root から直接辿れるオブジェクトをマーキ
ング。処理中は Stop The World が発生する
•マーキング情報はビットマップ (CMSBitMap)
と呼ばれるデータ構造で管理される
52
Initial mark Concurrent mark Concurrent preclean Remark Concurrent sweep Concurrent reset
- 53. Initial mark
•[GC [1 CMS-initial-mark:
2925342K(3853568K)] 2937899K(4160256K),
0.0098890 secs] [Times: user=0.00 sys=0.00,
real=0.01 secs]
•Root から直接辿れるオブジェクトをマーキ
ング。処理中は Stop The World が発生する
•マーキング情報はビットマップ (CMSBitMap)
と呼ばれるデータ構造で管理される
フェーズ Old 領域
ヒープ全体
処理時間(STW)
53
処理時間
Initial mark Concurrent mark Concurrent preclean Remark Concurrent sweep Concurrent reset
- 54. Initial mark
• VM_Operation::evaluate()
• VM_CMS_Initial_Mark::doit()
• CMSCollector::do_CMS_operation()
• checkpointRootsInitial()
• GenCollectedHeapSharedHeap::gen_process_strong_roots()
SharedHeap::process_strong_roots()
• Universe::oops_do()
• MarkRefsIntoClosure::do_oop()
• :
• CMSBitMap::mark()
54Inside OpenJDK
Initial mark Concurrent mark Concurrent preclean Remark Concurrent sweep Concurrent reset
- 56. Concurrent mark
•[CMS-concurrent-mark-start]
•[CMS-concurrent-mark: 0.454/0.454 secs]
[Times: user=1.38 sys=0.00, real=0.45 secs]
•全スレッドを再開しつつ、Initial mark でマーク
したオブジェクトから辿れる全てのオブジェク
トをマーキング
•Minor GC が発生した場合、作成・更新したオブ
ジェクトはCard Table (Dirty Card)で管理される
56
処理時間
他スレッドへの処理
(yield等)を含む wall timeフェーズ開始
フェーズ完了
Initial mark Concurrent mark Concurrent preclean Remark Concurrent sweep Concurrent reset
- 57. Concurrent mark
• CMSCollector::markFromRoots()
• :
• CMSBitMap::iterate()
• MarkFromRootsClosure::do_bit()
• :
• oopDesc::oop_iterate()
• instanceRefKlass::oop_oop_iterate_nv() … (mark対象クラスに依る)
• PushOrMarkClosure::do_oop_nv()
• :
• CMSBitMap::mark()
57Inside OpenJDK
Initial mark Concurrent mark Concurrent preclean Remark Concurrent sweep Concurrent reset
- 60. Concurrent abortable preclean
•Eden 使用量が 2MB 以下になるまで最大
5秒 待つ
•CMSScheduleRemarkEdenSizeThreshould
•CMSMaxAbortablePrecleanTime で設定
•最大まで待ったら「CMS: abort preclean
due to time」を出力してフェーズ終了
•「abortable」の所以。エラーではない
• 例: Minor GC が一度も起きなかった
60
Initial mark Concurrent mark Concurrent preclean Remark Concurrent sweep Concurrent reset
- 61. Concurrent preclean
• CMSCollector::preclean()
• :
• ReferenceProcessor::preclean_discoverd_references()
• CMSDrainMarkingStackClosure::do_void()
• oopDesc::oop_iterate() … (スタックされたmark済みoop)
• :
• CMSBitMap::mark()
61Inside OpenJDK
Initial mark Concurrent mark Concurrent preclean Remark Concurrent sweep Concurrent reset
- 62. Remark (Final mark)
• [GC
[YG occupancy: 54721 K (306688 K)]
[Rescan (parallel) , 0.0256580 secs]
[weak refs processing, 0.0245990 secs]
[class unloading, 0.0403370 secs]
[scrub symbol table, 0.0197600 secs]
[scrub string table, 0.0044930 secs]
[1 CMS-remark: 2925342K(3853568K)]
2980064K(4160256K), 0.1238550 secs]
[Times: user=0.20 sys=0.00, real=0.12 secs]
62
処理時間(STW)
漏れがないよう
に全スレッドを
止めてスキャン、
マーキング。
Initial mark Concurrent mark Concurrent preclean Remark Concurrent sweep Concurrent reset
- 63. Remark (Final mark)
• [GC
[YG occupancy: 54721 K (306688 K)]
[Rescan (parallel) , 0.0256580 secs]
[weak refs processing, 0.0245990 secs]
[class unloading, 0.0403370 secs]
[scrub symbol table, 0.0197600 secs]
[scrub string table, 0.0044930 secs]
[1 CMS-remark: 2925342K(3853568K)]
2980064K(4160256K), 0.1238550 secs]
[Times: user=0.20 sys=0.00, real=0.12 secs]
New領域のサイズ(処理はなし)
Remark (二世代
スキャン。Dirty
Cardをマーキング)
ソフト参照・弱参照オブジェクトの開放
Old領域のサイズ
63
ヒープ全体サイズ
Initial mark Concurrent mark Concurrent preclean Remark Concurrent sweep Concurrent reset
- 64. Remark (Final mark)
• [GC
[YG occupancy: 54721 K (306688 K)]
[Rescan (parallel) , 0.0256580 secs]
[weak refs processing, 0.0245990 secs]
[class unloading, 0.0403370 secs]
[scrub symbol table, 0.0197600 secs]
[scrub string table, 0.0044930 secs]
[1 CMS-remark: 2925342K(3853568K)]
2980064K(4160256K), 0.1238550 secs]
[Times: user=0.20 sys=0.00, real=0.12 secs]
CMSClassUnloadingEnabledが有効な時に実行
クラスアンロード
シンボルテーブル
のゴミ回収
interned string 回収
64
Initial mark Concurrent mark Concurrent preclean Remark Concurrent sweep Concurrent reset
- 65. Remark (Final mark)
• CMSCollector::do_CMS_operation()
• checkpointRootsFinal()
• do_remark_parallel() / do_remark_non_parallel()
• :
• CMSParRemarkTask::work()
• CMSParRemarkTask::do_dirty_card_rescan_tasks()
• CardTableModRefBS::dirty_card_iterate()
• CMSBitMap::mark_range()
65Inside OpenJDK
Initial mark Concurrent mark Concurrent preclean Remark Concurrent sweep Concurrent reset
- 70. まとめ
•GC ログの読み方
•STW 時間 ([Times: 以降の real 値)
•ParNew, CMS-initial-mark, CMS-remark
•ヒープ使用量の推移
•GC前K -> GC後K (総容量)
•基本的には GUI Tool を使いましょう
•細かく調査する時はログを見る
70
- 72. Full GC (with STW)
Eden
Survivor
1
Survivor
0
Tenured
Perm
/
Meta
space
GC 対象
72
• 断片化で割り当てられない (promotion failed)
• 回収が間に合わない (concurrent mode failure)
発生条件
再掲
- 73. promotion failed
•3.586: [GC3.586: [ParNew (promotion failed):
232923K->283768K(306688K), 0.1500250 secs] 3.736:
[CMS: 3102003K->240898K(3853568K), 1.8438740
secs] 3334926K->259898K(4160256K), [CMS Perm :
125100K->116602K(262144K)], 1.9941370 secs]
[Times: user=2.05 sys=0.00, real=1.99 secs]
1. Old 領域で断片化が進む/不足する
2. Minor GC 中の promotion に失敗
3. 断片化解消のため、FullGC を実行
73
- 74. promotion failed
•3.586: [GC3.586: [ParNew (promotion failed):
232923K->283768K(306688K), 0.1500250 secs] 3.736:
[CMS: 3102003K->240898K(3853568K), 1.8438740
secs] 3334926K->259898K(4160256K), [CMS Perm :
125100K->115103K(262144K)], 1.9941370 secs]
[Times: user=2.05 sys=0.00, real=1.99 secs]
1. Old 領域で断片化が進む/不足する
2. Minor GC 中の promotion に失敗
3. 断片化解消のため、FullGC を実行
74
ヒープ全体 New領域
Old領域 Perm領域
処理時間
(STW)
- 76. promotion failed 対策
•見落としがちな兆候
•Minor GC 後のOld領域より、次の Minor GC
の GC 前の Old 領域の方が大きい
•New 領域に割り当てず Old 領域に直接オ
ブジェクトを割り当てている
•Old 領域 > New 領域だが promotion failed
•断片化が深刻なレベルで発生している。
短い期間で発生していたら要注意
76
- 77. concurrent mode failure
•62.696: [Full GC62.696: [CMS64.460: [CMS-concurrent-
sweep: 2.319/2.386 secs] [Times: user=3.75 sys=0.13,
real=2.39 secs] (concurrent mode failure): 3315076K-
>398110K(3853568K), 5.4293100 secs] 3320358K-
>398110K(4160256K), [CMS Perm : 125738K-
>125738K(262144K)], 5.4294290 secs] [Times: user=5.43
sys=0.00, real=5.43 secs]
•CMS GC 実行中に更に CMS GC が要求された。
CMS サイクルは同時処理が行えないため、
FullGC を呼び出して空きメモリを確保する
77
処理時間(STW)
- 78. concurrent mode failure 対策
•CMS GCの回収が間に合わない
•CMS GCの開始タイミングを早める
•-XX:+CMSInitiatingOccupancyFraction を
下げる
•サーバのスペックアップ
•スレッド単体の処理速度を上げる
•並列度(スレッド数)を上げる
•メモリだけ増やすと処理量が増えて逆効果
78
- 79. Minor GC と CMS GC の競合は?
•競合しない
•データ競合
•CMS GC はマーキングに専用のビットマッ
プを利用しているので競合しない
•スレッド競合
•Minor GCが動く → CMS GCスレッドが一時
停止する (STW なので全スレッド一時停止)
79
- 80. GC Locker
•18.412: [GC18.412: [ParNew (promotion failed):
307246K->305703K(306688K), 0.1039500 secs]
3695539K->3798331K(4160256K), 0.1041210 secs]
[Times: user=0.20 sys=0.00, real=0.10 secs]
•GC locker: Trying a full collection because scavenge failed
•18.516: [Full GC18.516: [CMS: 3112627K-
>662510K(3853568K), 3.5806870 secs] 3418331K-
>662510K(4160256K), [CMS Perm : 115836K-
>115846K(262144K)], 3.5808080 secs] [Times:
user=3.58 sys=0.01, real=3.58 secs]
80
- 81. 81
•GC locker: GC を止める機構
•HotSpot 初期化中
•JNI API 呼び出し (Get*Critical(),(画像処理等))
•Trying a full collection because scavenge failed
•GC 停止中にばんばんオブジェクト作成
→ New領域満杯 → OLD領域に直接割り当て
→ 深刻な断片化 -(最終的に)→ promotion 失敗
•CMS GC と相性がかなり悪い
GC Locker: 何が起きたのか
- 82. GC Locker: 最悪なケース
• 1085.695: [CMS-concurrent-sweep-start]
• 1086.736: [GC1086.736: [ParNew (promotion failed): 300234K-
>297058K(306688K), 0.1784670 secs] 3833880K-
>3893624K(4160256K), 0.2084860 secs] [Times: user=0.26 sys=0.00,
real=0.20 secs]
• GC locker: Trying a full collection because scavenge failed
• 1087.214: [Full GC1087.215: [CMS1104.749: [CMS-concurrent-sweep:
18.564/19.051 secs] [Times: user=28.84 sys=0.25, real=19.05 secs]
(concurrent mode failure): 2986166K->357385K(3853568K),
16.8898790 secs] 3894624K->358385K(4160256K), [CMS Perm :
128222K->128215K(262144K)], 20.8900340 secs] [Times: user=27.84
sys=0.00, real=20.99 secs]
82
やばい
- 83. GC Locker + Sweep
• 1085.695: [CMS-concurrent-sweep-start]
• 1086.736: [GC1086.736: [ParNew (promotion failed): 300234K-
>297058K(306688K), 0.1784670 secs] 3833880K-
>3893624K(4160256K), 0.2084860 secs] [Times: user=0.26 sys=0.00,
real=0.20 secs]
• GC locker: Trying a full collection because scavenge failed
• 1087.214: [Full GC1087.215: [CMS1104.749: [CMS-concurrent-sweep:
18.564/19.051 secs] [Times: user=28.84 sys=0.25, real=19.05 secs]
(concurrent mode failure): 2986166K->357385K(3853568K),
16.8898790 secs] 3894624K->358385K(4160256K), [CMS Perm :
128222K->128215K(262144K)], 20.8900340 secs] [Times: user=27.84
sys=0.00, real=20.99 secs]
83
Full GC (STW) 開始
Concurrent Sweep 開始
Concurrent Sweep 完了
Sweep(一部) + FullGC の間 STW
FreeList
- 84. GC Locker 対策
•GC Locker の頻度を下げる
•-XX:+PrintGCCause
•[GC(GCLocker Initiated GC) …
•断片化しない GC を使う
•短命 JVM で対処する
84
- 87. Reference
•Tony Printezis, David Detlefs. A Generational
Mostly-concurrent Garbage Collection (ISMM 2000)
•中村成洋, 相川光.ガベージコレクションのアルゴリ
ズムと実装
•中村成洋. 徹底解剖「G1GC」アルゴリズム編
•中村成洋. 徹底解剖「G1GC」実装編
•http://hg.openjdk.java.net/jdk7u/jdk7u
87
- 90. ヒープの確保
• JNI_CreateJavaVM() … JVM 作成&初期化
• Threads::create_vm()
• Universe::initialize_heap() … GC に応じた各メモリ管理の初期化
• GC に基づいて CollectedHeap(ヒープ領域の定義クラス), CollectorPolicy (メ
モリ管理方針の定義クラス) を作成。
• CMS の場合はそれぞれ以下。
• (AS)ConcurrentMarkSweepPolicy(), GenCollectedHeap()
• CollectHeap::initialize() … GC アルゴリズム応じたヒープ領域確保
• CMSの場合は、GenCollectedHeap::initialize()
• ConcurrentMarkSweepPolicy(), GenCollectorPolicy::initialize_all()
• ヒープ空間の各世代に対応する Generation オブジェクトを作成
• CMS GC Thread の作成
90Inside OpenJDK
- 91. GC 着火
• メモリ確保
• 4 つの bytecode (new, newarray, anewarray, multianewarray)
• TemplateTable 起動
• 各 Runtime クラスからメモリ確保関数が呼ばれる
• instanceKlass::allocate_instance(), oopFactory::new_typeArray(),
oopFactory::new_objArray(), arrayKlass::multi_allocate()
• 最終的に CollectedHeap::common_mem_allocate_init() を呼ぶ
• TLAB からの確保 (UseTLAB使用時, CollectedHeap::allocate_from_tlab())
• CollectedHeap::mem_allocate() … GCに応じたメモリ確保
• この二つの両方で失敗したら OufOfMemoryError
91Inside OpenJDK
- 92. GC 着火
• GenCollectedHeap::mem_allocate() … CMS のメモリ確保
• GenCollectorPolicy::mem_allocate_work()
• Generation::par_allocate() … New領域からの獲得
• GenCollectedHeap::attempt_allocation() … 各世代からの獲得
• Generation::allocate() … 各世代定義オブジェクトの処理
• GenCollectorPolicy::expand_heap_and_allocate() … ヒープ拡張
• VM_GenCollectForAllocation::doit() … GC の起動
• GenCollectedHeap::do_collection()
• GenCollectorPolicy::satisfy_failed_allocation()
• GC後、上のmem_allocate_work()が行われる
92Inside OpenJDK