Concurrent MarkSweep 6JVMOpen JDK nminorunminoru jp nminoru 1975gmail

  • Slides: 23
Download presentation
Concurrent Mark&Sweep 第 6回JVMソースコードリーディングの会(Open. JDK) 中村 実 nminoru@nminoru. jp nminoru 1975@gmail. com Twitter @nminoru_jp

Concurrent Mark&Sweep 第 6回JVMソースコードリーディングの会(Open. JDK) 中村 実 nminoru@nminoru. jp nminoru 1975@gmail. com Twitter @nminoru_jp 1

Parallel GCとConcurrent GC • Stop the world(STW)型GC – Javaスレッド(Mutator)を止めてからGC – Parallel GCはSTWした後のGC処理を複数のスレッドが分 担 •

Parallel GCとConcurrent GC • Stop the world(STW)型GC – Javaスレッド(Mutator)を止めてからGC – Parallel GCはSTWした後のGC処理を複数のスレッドが分 担 • Concurrent GC – JavaスレッドとGCスレッドが同時に動く Parallel GC GC Concurrent GC Java threads GC threads

Hotspot VMのConcurrent GC • Mostly Concurrent Mark & Sweep(CMS) – ほとんどconcurrentだが一部停止するGC – Tony Printezis,

Hotspot VMのConcurrent GC • Mostly Concurrent Mark & Sweep(CMS) – ほとんどconcurrentだが一部停止するGC – Tony Printezis, David Detlefs. A Generational Mostly-concurrent Garbage Collection (ISMM 2000) Mostly Concurrent GC GC Java threads GC threads 4

CMS • Mark&Sweep – Marking phase • Concurrent marking • Serial marking(Hotspot VMの用語でfinal marking)

CMS • Mark&Sweep – Marking phase • Concurrent marking • Serial marking(Hotspot VMの用語でfinal marking) – Sweeping phase • Concurrent sweeping 5

Open. JDKでの CMSの実装 9

Open. JDKでの CMSの実装 9

Open. JDKのGCの種類 オプション ヒープのクラス 空間のクラス 逐次GC -XX: +Use. Serial. GC Gen. Collected. Heap Def.

Open. JDKのGCの種類 オプション ヒープのクラス 空間のクラス 逐次GC -XX: +Use. Serial. GC Gen. Collected. Heap Def. New. Generation Tenured. Generation 並列GC -XX: +Use. Par. New. GC Gen. Collected. Heap Par. New. Generation Tenured. Generation 並列GC -XX: +Use. Parallel. GC Parallel. Scavenge. Heap コンカレントGC -Xconcgc or -XX: +Use. Conc. Mark. Sweep. GC Gen. Collected. Heap インクリメンタ ルGC -Xincgc Gen. Collected. Heap (コンカレントGCにXX: +CMSIncremental. Mod eをつけたもの) G 1 GC -XX: +Use. G 1 GC Par. New. Generation Concurrent. Mark. Sweep 同上 G 1 Collected. Heap 10

CMSのオプション 説明 -Xconcgc or -XX: +Use. Conc. Mark. Sweep. GC Concurrent GCを有効にする。 -XX: Conc.

CMSのオプション 説明 -Xconcgc or -XX: +Use. Conc. Mark. Sweep. GC Concurrent GCを有効にする。 -XX: Conc. GCThreads=<n> Concurrent GCスレッド数を指定する。 デフォルトは 0でConcurrent GCスレッドは 1となる。 -XX: +CMSParallel. Remark. Enabled CMS Full GCをマルチスレッドで実行する。 マルチCPU環境ではデフォルトで指定される。 -XX: CMSWait. Duration=<n> 同期型のGCが起きた後に<n>ミリ秒経った後にCMSを開始 する。デフォルトは 2000ミリ秒。 -XX: +Print. GCDetails GCの詳細を表示する。 -XX: +Trace. CMSState Concurrent Mark&Sweepに関係する出力を増やす(デバッグ 版のみ)。 hotspot/src/share/vm/runtime/globals. hppに多数存在。 11

Card Makingの流用 dirty clean – 512バイト単位に 1バイトのバイトテーブル – Clean cardは 0 x. FF、dirty cardは

Card Makingの流用 dirty clean – 512バイト単位に 1バイトのバイトテーブル – Clean cardは 0 x. FF、dirty cardは 0 – 本来は旧世代から新世代を指すオブジェ クトの位置を記録 A B Card Table • Concurrent markingのためにはライト バリアが必要。でも世代別GCには似 たような処理があるので流用 • Card Table Old Gen. New Gen. • putfield/putstatic/aastoreにフック – A. field = B実行時になら Card. Table. Mod. Ref. BS: : byte_map_base [uintptr_t(A) >> Card. Table. Mod. Ref. BS: : card_shift] = 0 14

CMSのフェーズ - Concurrent. Mark. Sweep. Thread: : run at concurrent. Mark. Sweep. Thread. cpp:

CMSのフェーズ - Concurrent. Mark. Sweep. Thread: : run at concurrent. Mark. Sweep. Thread. cpp: 128 - CMSCollector: : collect_in_background at concurrent. Mark. Sweep. Generation. cpp: 2246 1 Initial. Marking (STW)Rootからのマーキング VM_CMS_Initial_Mark: : doit() 2 Marking 通常のconcurrent marking CMSCollector: : mark. From. Roots() 3 Precleaning 弱参照系のconcurrent marking CMSCollector: : preclean() 4 Abortable. Preclean 5 Final. Marking (STW)Markingの残り VM_CMS_Final_Remark: : doit() 6 Sweeping 回収 CMSCollector: : sweep 7 Resizing 空間のサイズ調整 CMSCollector: : compute_new_size 8 Resetting ビットマップのクリアなど CMSCollector: : reset 9 Idling CMSWait. Durationミリ秒待機 CMSCollector: : abortable_preclean() 3と 4の処理は省略されることがある。 16

Initial. Marking • RootからのマークはSTWで行う。 • Concurrent. Mark. Sweep. Threadスレッドが指示を出すが、実際の処理 はVMThreadが行う。 #0 CMSBit. Map: :

Initial. Marking • RootからのマークはSTWで行う。 • Concurrent. Mark. Sweep. Threadスレッドが指示を出すが、実際の処理 はVMThreadが行う。 #0 CMSBit. Map: : mark() at global. Definitions. hpp: 418 #1 Mark. Refs. Into. Closure: : do_oop() at concurrent. Mark. Sweep. Generation. cpp: 6586 #2 Mark. Refs. Into. Closure: : do_oop_work<oop. Desc*>(oop. Desc**) at hotspot/src/share/vm/utilities/global. Definitions. hpp: 418 #3 Mark. Refs. Into. Closure: : do_oop() at concurrent. Mark. Sweep. Generation. cpp: 6590 #4 Universe: : oops_do() at hotspot/src/share/vm/memory/universe. cpp: 208 #5 Shared. Heap: : process_strong_roots() at hotspot/src/share/vm/memory/shared. Heap. cpp: 139 #6 Gen. Collected. Heap: : gen_process_strong_roots() at hotspot/src/share/vm/memory/gen. Collected. Heap. cpp: 741 #7 CMSCollector: : checkpoint. Roots. Initial. Work() at concurrent. Mark. Sweep. Generation. cpp: 3570 #8 CMSCollector: : checkpoint. Roots. Initial() at concurrent. Mark. Sweep. Generation. cpp: 3489 #9 CMSCollector: : do_CMS_operation() atconcurrent. Mark. Sweep. Generation. cpp: 6306 #10 VM_CMS_Initial_Mark: : doit() at concurrent. Mark. Sweep/vm. CMSOperations. cpp: 140 #11 VM_Operation: : evaluate() at hotspot/src/share/vm/runtime/vm_operations. cpp: 65 17

Marking #0 CMSBit. Map: : mark() at global. Definitions. hpp: 418 #1 Push. Or.

Marking #0 CMSBit. Map: : mark() at global. Definitions. hpp: 418 #1 Push. Or. Mark. Closure: : do_oop() at concurrent. Mark. Sweep. Generation. cpp: 7555 #2 Push. Or. Mark. Closure: : do_oop_work<oop. Desc*>(oop. Desc**) at global. Definitions. hpp: 418 #3 Push. Or. Mark. Closure: : do_oop_nv(oop. Desc**) () at hotspot/src/share/vm/runtime/thread. hpp: 1826 #4 instance. Klass: : oop_iterate_nv() at hotspot/src/share/vm/oops/instance. Klass. cpp: 1825 #5 instance. Ref. Klass: : oop_iterate_nv() at hotspot/src/share/vm/oops/instance. Ref. Klass. cpp: 285 #6 oop. Desc: : oop_iterate() at /global. Definitions. hpp: 418 #7 Mark. From. Roots. Closure: : scan. Oops. In. Oop() at concurrent. Mark. Sweep. Generation. cpp: 7215 #8 Mark. From. Roots. Closure: : do_bit() at concurrent. Mark. Sweep. Generation. cpp: 7113 #9 Bit. Map: : iterate() at hotspot/src/share/vm/utilities/bit. Map. cpp: 512 #10 Bit. Map: : iterate() at global. Definitions. hpp: 418 #11 CMSBit. Map: : iterate() at global. Definitions. hpp: 418 #12 CMSCollector: : do_marking_st() at concurrent. Mark. Sweep. Generation. cpp: 4325 #13 CMSCollector: : mark. From. Roots. Work() at concurrent. Mark. Sweep. Generation. cpp: 3692 #14 CMSCollector: : mark. From. Roots() at concurrent. Mark. Sweep. Generation. cpp: 3629 #15 CMSCollector: : collect_in_background() at concurrent. Mark. Sweep. Generation. cpp: 2288 #16 Concurrent. Mark. Sweep. Thread: : run() at concurrent. Mark. Sweep. Thread. cpp: 128 18

Preclean #0 CMSDrain. Marking. Stack. Closure: : do_void() at concurrent. Mark. Sweep. Generation. cpp:

Preclean #0 CMSDrain. Marking. Stack. Closure: : do_void() at concurrent. Mark. Sweep. Generation. cpp: 8638 #1 Reference. Processor: : preclean_discovered_reflist() at hotspot/src/share/vm/memory/reference. Processor. cpp: 1433 #2 Reference. Processor: : preclean_discovered_references() at hotspot/src/share/vm/memory/reference. Processor. cpp: 1345 #3 CMSCollector: : preclean_work() at concurrent. Mark. Sweep. Generation. cpp: 4542 #4 CMSCollector: : preclean() at concurrent. Mark. Sweep. Generation. cpp: 4376 #5 CMSCollector: : collect_in_background() at concurrent. Mark. Sweep. Generation. cpp: 2300 #6 Concurrent. Mark. Sweep. Thread: : run() at concurrent. Mark. Sweep. Thread. cpp: 128 19

Final. Marking • Markingの最後はSTWして行う。 • Card markingによってdirty cardがある場所のみをマークする。 #0 CMSBit. Map: : mark_range() at

Final. Marking • Markingの最後はSTWして行う。 • Card markingによってdirty cardがある場所のみをマークする。 #0 CMSBit. Map: : mark_range() at hotspot/src/share/vm/memory/card. Table. RS. hpp: 150 #1 Card. Table. Mod. Ref. BS: : dirty_card_iterate() at hotspot/src/share/vm/memory/card. Table. Mod. Ref. BS. cpp: 617 #2 CMSPar. Remark. Task: : do_dirty_card_rescan_tasks() at concurrent. Mark. Sweep. Generation. cpp: 5322 #3 CMSPar. Remark. Task: : work() at concurrent. Mark. Sweep. Generation. cpp: 5171 #4 Gang. Worker: : loop() at hotspot/src/share/vm/utilities/workgroup. cpp: 308 #5 Gang. Worker: : run() at Open. JDK/hotspot/src/share/vm/utilities/workgroup. cpp: 224 #6 java_start() at Open. JDK/hotspot/src/os/linux/vm/os_linux. cpp: 852 20

Sweep(1/3) • CMSCollector: : sweep at concurrent. Mark. Sweep. Generation. cpp: 5976 void CMSCollector:

Sweep(1/3) • CMSCollector: : sweep at concurrent. Mark. Sweep. Generation. cpp: 5976 void CMSCollector: : sweep(bool asynch) { // Perm. Gen の sweep が禁止されていた場合でも無効なオブジェクトを // _perm_gen_verify_bit_map Bit. Map に移す。 Mark. Dead. Objects. Closure mdo(this, _perm. Gen->cms. Space(), mark. Bit. Map(), perm_gen_verify_bit_map()); _perm. Gen->cms. Space()->blk_iterate(&mdo); // Sweep 処理 sweep. Work(_perm. Gen, asynch); 21

Sweep(2/3) concurrent. Mark. Sweep. Generation. cpp: 9214 size_t Mark. Dead. Objects. Closure: : do_blk(Heap.

Sweep(2/3) concurrent. Mark. Sweep. Generation. cpp: 9214 size_t Mark. Dead. Objects. Closure: : do_blk(Heap. Word* addr) { size_t res = _sp->block_size_no_stall(addr, _collector); if (_sp->block_is_obj(addr)) { if (_live_bit_map->is. Marked(addr)) { } else { _dead_bit_map->mark(addr); // mark the dead object } } return res; } #0 #1 #2 #3 #4 Mark. Dead. Objects. Closure: : do_blk() at concurrent. Mark. Sweep. Generation. cpp: 9214 Compactible. Free. List. Space: : blk_iterate() at concurrent. Mark. Sweep/compactible. Free. List. Space. cpp: 771 CMSCollector: : sweep() at concurrent. Mark. Sweep. Generation. cpp: 6000 CMSCollector: : collect_in_background() at concurrent. Mark. Sweep. Generation. cpp: 2333 Concurrent. Mark. Sweep. Thread: : run() at concurrent. Mark. Sweep. Thread. cpp: 128 22

Sweep(3/) #0 Sweep. Closure: : do_yield_work() at concurrent. Mark. Sweep. Generation. cpp: 8435 #1

Sweep(3/) #0 Sweep. Closure: : do_yield_work() at concurrent. Mark. Sweep. Generation. cpp: 8435 #1 Sweep. Closure: : do_yield_check(Heap. Word*) at hotspot/src/share/vm/utilities/global. Definitions. hpp: 418 #2 Sweep. Closure: : do_blk_careful() at concurrent. Mark. Sweep. Generation. cpp: 8017 #3 Compactible. Free. List. Space: : blk_iterate_careful() at concurrent. Mark. Sweep/compactible. Free. List. Space. cpp: 763 #4 CMSCollector: : sweep. Work() at concurrent. Mark. Sweep. Generation. cpp: 6201 #5 CMSCollector: : sweep() at concurrent. Mark. Sweep. Generation. cpp: 6018 #6 CMSCollector: : collect_in_background() at concurrent. Mark. Sweep. Generation. cpp: 2333 #7 Concurrent. Mark. Sweep. Thread: : run() at concurrent. Mark. Sweep. Thread. cpp: 128 23