SlideShare a Scribd company logo
1 of 23
Download to read offline
Concurrent Mark&Sweep
第6回JVMソースコードリーディングの会(OpenJDK)

              中村 実
        nminoru@nminoru.jp
      nminoru1975@gmail.com
       Twitter @nminoru_jp

                                1
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                  Java threads

GC threads                    GC threads
Concurrent GC
• メリット
 – Javaが常に動けるのでGCによる停止がない。
• デメリット
 – 機構が複雑になり、JavaスレッドとGCスレッド
   が邪魔しあうのでスループット性能が落ちる。
Hotspot VMのConcurrent GC
   • Mostly Concurrent Mark & Sweep(CMS)
       – ほとんどconcurrentだが一部停止するGC
       – Tony Printezis, David Detlefs. A Generational
         Mostly-concurrent Garbage Collection (ISMM
         2000)
                           GC
Mostly Concurrent GC

Java threads

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




                                                5
Concurrent Marking(1/3)
• Marking threadはrootから初めてオブジェクトを巡回し
  マーキングする(着色したオブジェクトはマークをあらわ
  す)
• Javaスレッドはその間も動いて、オブジェクトを生成・参
  照の変更を行う。


        Heap
Root
                2    3     5
           1
                     4
                                   6
Concurrent Marking(2/3)
• Marking threadとJavaスレッドが同時に動くと衝突が発生
   – (A) 余分なマーク
       • 3をマークし後に2→3の参照が切れた。
   – (B) マーク漏れ
       • 1をマークした後に6が作られた。
• (A)はGCが回収する量が減るだけだが、(B)は許されない。


          Heap         (A)
Root
                   2         3   5
             1
                             4
             (B)   6
                                        7
Concurrent Marking(3/3)
• Write barrier
  – Javaスレッドがputfield/putstaticなどを実行した時
    に、そのrecieverにライトバリアを付ける。
    (A.field = B なら A にライトバリア)
• Serial marking
  – Concurrent markingの後にSTWを起こしてライトバ
    リアがついている場所から残りのmarkingを行う。



                                          8
OpenJDKでの CMSの実装




                   9
OpenJDKのGCの種類
                 オプション                  ヒープのクラス                空間のクラス
逐次GC       -XX:+UseSerialGC          GenCollectedHeap       DefNewGeneration
                                                            TenuredGeneration
並列GC       -XX:+UseParNewGC          GenCollectedHeap       ParNewGeneration
                                                            TenuredGeneration
並列GC       -XX:+UseParallelGC        ParallelScavengeHeap
コンカレントGC   -Xconcgc or               GenCollectedHeap       ParNewGeneration
           -XX:+UseConcMarkSweepGC                          ConcurrentMarkSweep

インクリメンタ    -Xincgc                   GenCollectedHeap       同上
ルGC        (コンカレントGCに-
           XX:+CMSIncrementalMod
           eをつけたもの)
G1GC       -XX:+UseG1GC              G1CollectedHeap
                                                                                10
CMSのオプション
          オプション                                   説明
-Xconcgc or                     Concurrent GCを有効にする。
-XX:+UseConcMarkSweepGC
-XX:ConcGCThreads=<n>           Concurrent GCスレッド数を指定する。
                                デフォルトは0でConcurrent GCスレッドは1となる。
-XX:+CMSParallelRemarkEnabled   CMS Full GCをマルチスレッドで実行する。
                                マルチCPU環境ではデフォルトで指定される。
-XX:CMSWaitDuration=<n>         同期型のGCが起きた後に<n>ミリ秒経った後にCMSを開始
                                する。デフォルトは2000ミリ秒。
-XX:+PrintGC                    GCの詳細を表示する。
-XX:+PrintGCDetails
-XX:+TraceCMSState              Concurrent Mark&Sweepに関係する出力を増やす(デバッグ
                                版のみ)。

  hotspot/src/share/vm/runtime/globals.hppに多数存在。
                                                                  11
Hotspot VMのCMSの概要
• ConcurrentMarkSweepThreadスレッドが全
  体を制御
• ヒープ空間は新旧2世代
• Write barrierはCard markingで代替
• CMSのマーキングはビットマーキング



                                    12
ヒープ構成
• 空間配置                                 Perm
  – 新世代はParNewGC(parallel copying
    GC)用。
  – 旧世代はCMS用でフリーリスト管理さ                Old Gen.
    れている。
• GC
  – 最初に新世代にParNewGCを起こす
    (STW型)                          From      To

  – 次に旧世代にCMS GCを起こす。                  Eden
  – それでも不足の場合はCMS Full GC
    を起こす(STW型)
                                              13
Card Makingの流用
                                                                                Old Gen.
 • Concurrent markingのためにはライト
   バリアが必要。でも世代別GCには似




                                                                                                dirty
                                                                                       A
   たような処理があるので流用
 • Card Table




                                                                                                clean
                                                                                  B
       – 512バイト単位に1バイトのバイトテーブル
       – Clean cardは0xFF、dirty cardは0




                                                                                                Card Table
       – 本来は旧世代から新世代を指すオブジェ
         クトの位置を記録                                                               New Gen.

 • putfield/putstatic/aastoreにフック
       – A.field = B実行時になら

CardTableModRefBS::byte_map_base [uintptr_t(A) >> CardTableModRefBS::card_shift] = 0
                                                                                           14
CMS GCとParNewGCの競合
     • マーキング領域
         – CMSのマーキングは専用のビットマップを使う
           (CMSBitMap)ので問題なし。
     • GC
         – ConcurrentMarkSweepThreadスレッドが動いている最
           中にParNewGCが起きることがある。
           その場合はConcurrentMarkSweepThreadが一時停止
           してから再開する。
                      ParNew GC    CMS GC

 Java threads
Parallel GC thr
 Conc GC thr                                  15
CMSのフェーズ
    - ConcurrentMarkSweepThread::run at concurrentMarkSweepThread.cpp:128
      - CMSCollector::collect_in_background at concurrentMarkSweepGeneration.cpp:2246


1   InitialMarking      (STW)Rootからのマーキング                    VM_CMS_Initial_Mark::doit()

2   Marking             通常のconcurrent marking                CMSCollector::markFromRoots()

3   Precleaning         弱参照系のconcurrent marking              CMSCollector::preclean()

4   AbortablePreclean                                        CMSCollector::abortable_preclean()

5   FinalMarking        (STW)Markingの残り                      VM_CMS_Final_Remark::doit()

6   Sweeping            回収                                   CMSCollector::sweep

7   Resizing            空間のサイズ調整                             CMSCollector::compute_new_size

8   Resetting           ビットマップのクリアなど                         CMSCollector::reset

9   Idling              CMSWaitDurationミリ秒待機

3と4の処理は省略されることがある。
                                                                                           16
InitialMarking
   • RootからのマークはSTWで行う。
   • ConcurrentMarkSweepThreadスレッドが指示を出すが、実際の処理
     はVMThreadが行う。

#0 CMSBitMap::mark() at globalDefinitions.hpp:418
#1 MarkRefsIntoClosure::do_oop() at concurrentMarkSweepGeneration.cpp:6586
#2 MarkRefsIntoClosure::do_oop_work<oopDesc*>(oopDesc**) at
hotspot/src/share/vm/utilities/globalDefinitions.hpp:418
#3 MarkRefsIntoClosure::do_oop() at concurrentMarkSweepGeneration.cpp:6590
#4 Universe::oops_do() at hotspot/src/share/vm/memory/universe.cpp:208
#5 SharedHeap::process_strong_roots() at hotspot/src/share/vm/memory/sharedHeap.cpp:139
#6 GenCollectedHeap::gen_process_strong_roots() at hotspot/src/share/vm/memory/genCollectedHeap.cpp:741
#7 CMSCollector::checkpointRootsInitialWork() at concurrentMarkSweepGeneration.cpp:3570
#8 CMSCollector::checkpointRootsInitial() at concurrentMarkSweepGeneration.cpp:3489
#9 CMSCollector::do_CMS_operation() atconcurrentMarkSweepGeneration.cpp:6306
#10 VM_CMS_Initial_Mark::doit() at concurrentMarkSweep/vmCMSOperations.cpp:140
#11 VM_Operation::evaluate() at hotspot/src/share/vm/runtime/vm_operations.cpp:65

                                                                                                  17
Marking
#0 CMSBitMap::mark() at globalDefinitions.hpp:418
#1 PushOrMarkClosure::do_oop() at concurrentMarkSweepGeneration.cpp:7555
#2 PushOrMarkClosure::do_oop_work<oopDesc*>(oopDesc**) at globalDefinitions.hpp:418
#3 PushOrMarkClosure::do_oop_nv(oopDesc**) () at hotspot/src/share/vm/runtime/thread.hpp:1826
#4 instanceKlass::oop_oop_iterate_nv() at hotspot/src/share/vm/oops/instanceKlass.cpp:1825
#5 instanceRefKlass::oop_oop_iterate_nv() at hotspot/src/share/vm/oops/instanceRefKlass.cpp:285
#6 oopDesc::oop_iterate() at /globalDefinitions.hpp:418
#7 MarkFromRootsClosure::scanOopsInOop() at concurrentMarkSweepGeneration.cpp:7215
#8 MarkFromRootsClosure::do_bit() at concurrentMarkSweepGeneration.cpp:7113
#9 BitMap::iterate() at hotspot/src/share/vm/utilities/bitMap.cpp:512
#10 BitMap::iterate() at globalDefinitions.hpp:418
#11 CMSBitMap::iterate() at globalDefinitions.hpp:418
#12 CMSCollector::do_marking_st() at concurrentMarkSweepGeneration.cpp:4325
#13 CMSCollector::markFromRootsWork() at concurrentMarkSweepGeneration.cpp:3692
#14 CMSCollector::markFromRoots() at concurrentMarkSweepGeneration.cpp:3629
#15 CMSCollector::collect_in_background() at concurrentMarkSweepGeneration.cpp:2288
#16 ConcurrentMarkSweepThread::run() at concurrentMarkSweepThread.cpp:128
                                                                                        18
Preclean



#0 CMSDrainMarkingStackClosure::do_void() at concurrentMarkSweepGeneration.cpp:8638
#1 ReferenceProcessor::preclean_discovered_reflist() at
hotspot/src/share/vm/memory/referenceProcessor.cpp:1433
#2 ReferenceProcessor::preclean_discovered_references() at
hotspot/src/share/vm/memory/referenceProcessor.cpp:1345
#3 CMSCollector::preclean_work() at concurrentMarkSweepGeneration.cpp:4542
#4 CMSCollector::preclean() at concurrentMarkSweepGeneration.cpp:4376
#5 CMSCollector::collect_in_background() at concurrentMarkSweepGeneration.cpp:2300
#6 ConcurrentMarkSweepThread::run() at concurrentMarkSweepThread.cpp:128

                                                                                  19
FinalMarking
  • Markingの最後はSTWして行う。
  • Card markingによってdirty cardがある場所のみをマークする。



#0 CMSBitMap::mark_range() at hotspot/src/share/vm/memory/cardTableRS.hpp:150
#1 CardTableModRefBS::dirty_card_iterate() at
hotspot/src/share/vm/memory/cardTableModRefBS.cpp:617
#2 CMSParRemarkTask::do_dirty_card_rescan_tasks() at
concurrentMarkSweepGeneration.cpp:5322
#3 CMSParRemarkTask::work() at concurrentMarkSweepGeneration.cpp:5171
#4 GangWorker::loop() at hotspot/src/share/vm/utilities/workgroup.cpp:308
#5 GangWorker::run() at OpenJDK/hotspot/src/share/vm/utilities/workgroup.cpp:224
#6 java_start() at OpenJDK/hotspot/src/os/linux/vm/os_linux.cpp:852


                                                                                   20
Sweep(1/3)
  • CMSCollector::sweep at concurrentMarkSweepGeneration.cpp:5976



void CMSCollector::sweep(bool asynch) {

  // PermGen の sweep が禁止されていた場合でも無効なオブジェクトを
  // _perm_gen_verify_bit_map BitMap に移す。
  MarkDeadObjectsClosure mdo(this, _permGen->cmsSpace(),
                 markBitMap(), perm_gen_verify_bit_map());

  _permGen->cmsSpace()->blk_iterate(&mdo);

  // Sweep 処理
  sweepWork(_permGen, asynch);
                                                                    21
Sweep(2/3)
concurrentMarkSweepGeneration.cpp:9214

size_t MarkDeadObjectsClosure::do_blk(HeapWord* addr) {
     size_t res = _sp->block_size_no_stall(addr, _collector);
     if (_sp->block_is_obj(addr)) {
           if (_live_bit_map->isMarked(addr)) {
           } else {
                 _dead_bit_map->mark(addr); // mark the dead object
           }
     }
     return res;
}

#0   MarkDeadObjectsClosure::do_blk() at concurrentMarkSweepGeneration.cpp:9214
#1   CompactibleFreeListSpace::blk_iterate() at concurrentMarkSweep/compactibleFreeListSpace.cpp:771
#2   CMSCollector::sweep() at concurrentMarkSweepGeneration.cpp:6000
#3   CMSCollector::collect_in_background() at concurrentMarkSweepGeneration.cpp:2333
#4   ConcurrentMarkSweepThread::run() at concurrentMarkSweepThread.cpp:128

                                                                                                       22
Sweep(3/3)


#0 SweepClosure::do_yield_work() at concurrentMarkSweepGeneration.cpp:8435
#1 SweepClosure::do_yield_check(HeapWord*) at
hotspot/src/share/vm/utilities/globalDefinitions.hpp:418
#2 SweepClosure::do_blk_careful() at concurrentMarkSweepGeneration.cpp:8017
#3 CompactibleFreeListSpace::blk_iterate_careful() at
concurrentMarkSweep/compactibleFreeListSpace.cpp:763
#4 CMSCollector::sweepWork() at concurrentMarkSweepGeneration.cpp:6201
#5 CMSCollector::sweep() at concurrentMarkSweepGeneration.cpp:6018
#6 CMSCollector::collect_in_background() at concurrentMarkSweepGeneration.cpp:2333
#7 ConcurrentMarkSweepThread::run() at concurrentMarkSweepThread.cpp:128

                                                                                     23

More Related Content

What's hot

C++ マルチスレッドプログラミング
C++ マルチスレッドプログラミングC++ マルチスレッドプログラミング
C++ マルチスレッドプログラミングKohsuke Yuasa
 
汎用性と高速性を目指したペアリング暗号ライブラリ mcl
汎用性と高速性を目指したペアリング暗号ライブラリ mcl汎用性と高速性を目指したペアリング暗号ライブラリ mcl
汎用性と高速性を目指したペアリング暗号ライブラリ mclMITSUNARI Shigeo
 
関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPUTakuro Iizuka
 
SEH on mingw32
SEH on mingw32SEH on mingw32
SEH on mingw32kikairoya
 
Spectre/Meltdownとその派生
Spectre/Meltdownとその派生Spectre/Meltdownとその派生
Spectre/Meltdownとその派生MITSUNARI Shigeo
 
Haswellサーベイと有限体クラスの紹介
Haswellサーベイと有限体クラスの紹介Haswellサーベイと有限体クラスの紹介
Haswellサーベイと有限体クラスの紹介MITSUNARI Shigeo
 
Effective Modern C++ 読書会 Item 35
Effective Modern C++ 読書会 Item 35Effective Modern C++ 読書会 Item 35
Effective Modern C++ 読書会 Item 35Keisuke Fukuda
 
関ジャバ JavaOne Tokyo 2012報告会
関ジャバ JavaOne Tokyo 2012報告会関ジャバ JavaOne Tokyo 2012報告会
関ジャバ JavaOne Tokyo 2012報告会Koichi Sakata
 
条件分岐とcmovとmaxps
条件分岐とcmovとmaxps条件分岐とcmovとmaxps
条件分岐とcmovとmaxpsMITSUNARI Shigeo
 
イマドキC++erのモテカワリソース管理術
イマドキC++erのモテカワリソース管理術イマドキC++erのモテカワリソース管理術
イマドキC++erのモテカワリソース管理術Kohsuke Yuasa
 
プロセスとコンテキストスイッチ
プロセスとコンテキストスイッチプロセスとコンテキストスイッチ
プロセスとコンテキストスイッチKazuki Onishi
 
LLVM overview 20110122
LLVM overview 20110122LLVM overview 20110122
LLVM overview 20110122nothingcosmos
 
規格書で読むC++11のスレッド
規格書で読むC++11のスレッド規格書で読むC++11のスレッド
規格書で読むC++11のスレッドKohsuke Yuasa
 
Lisp Tutorial for Pythonista : Day 4
Lisp Tutorial for Pythonista : Day 4Lisp Tutorial for Pythonista : Day 4
Lisp Tutorial for Pythonista : Day 4Ransui Iso
 
Visual C++コード分析を支えるSAL
Visual C++コード分析を支えるSALVisual C++コード分析を支えるSAL
Visual C++コード分析を支えるSALegtra
 
Effective Modern C++ 勉強会#3 Item16
Effective Modern C++ 勉強会#3 Item16Effective Modern C++ 勉強会#3 Item16
Effective Modern C++ 勉強会#3 Item16Mitsuru Kariya
 
はじめてのRuby拡張ライブラリ
はじめてのRuby拡張ライブラリはじめてのRuby拡張ライブラリ
はじめてのRuby拡張ライブラリMasahiro Tomita
 
研究動向から考えるx86/x64最適化手法
研究動向から考えるx86/x64最適化手法研究動向から考えるx86/x64最適化手法
研究動向から考えるx86/x64最適化手法Takeshi Yamamuro
 

What's hot (20)

C++ マルチスレッドプログラミング
C++ マルチスレッドプログラミングC++ マルチスレッドプログラミング
C++ マルチスレッドプログラミング
 
汎用性と高速性を目指したペアリング暗号ライブラリ mcl
汎用性と高速性を目指したペアリング暗号ライブラリ mcl汎用性と高速性を目指したペアリング暗号ライブラリ mcl
汎用性と高速性を目指したペアリング暗号ライブラリ mcl
 
ゆるバグ
ゆるバグゆるバグ
ゆるバグ
 
関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU
 
SEH on mingw32
SEH on mingw32SEH on mingw32
SEH on mingw32
 
Spectre/Meltdownとその派生
Spectre/Meltdownとその派生Spectre/Meltdownとその派生
Spectre/Meltdownとその派生
 
Haswellサーベイと有限体クラスの紹介
Haswellサーベイと有限体クラスの紹介Haswellサーベイと有限体クラスの紹介
Haswellサーベイと有限体クラスの紹介
 
Effective Modern C++ 読書会 Item 35
Effective Modern C++ 読書会 Item 35Effective Modern C++ 読書会 Item 35
Effective Modern C++ 読書会 Item 35
 
関ジャバ JavaOne Tokyo 2012報告会
関ジャバ JavaOne Tokyo 2012報告会関ジャバ JavaOne Tokyo 2012報告会
関ジャバ JavaOne Tokyo 2012報告会
 
条件分岐とcmovとmaxps
条件分岐とcmovとmaxps条件分岐とcmovとmaxps
条件分岐とcmovとmaxps
 
イマドキC++erのモテカワリソース管理術
イマドキC++erのモテカワリソース管理術イマドキC++erのモテカワリソース管理術
イマドキC++erのモテカワリソース管理術
 
プロセスとコンテキストスイッチ
プロセスとコンテキストスイッチプロセスとコンテキストスイッチ
プロセスとコンテキストスイッチ
 
LLVM overview 20110122
LLVM overview 20110122LLVM overview 20110122
LLVM overview 20110122
 
規格書で読むC++11のスレッド
規格書で読むC++11のスレッド規格書で読むC++11のスレッド
規格書で読むC++11のスレッド
 
Lisp Tutorial for Pythonista : Day 4
Lisp Tutorial for Pythonista : Day 4Lisp Tutorial for Pythonista : Day 4
Lisp Tutorial for Pythonista : Day 4
 
Visual C++コード分析を支えるSAL
Visual C++コード分析を支えるSALVisual C++コード分析を支えるSAL
Visual C++コード分析を支えるSAL
 
llvm入門
llvm入門llvm入門
llvm入門
 
Effective Modern C++ 勉強会#3 Item16
Effective Modern C++ 勉強会#3 Item16Effective Modern C++ 勉強会#3 Item16
Effective Modern C++ 勉強会#3 Item16
 
はじめてのRuby拡張ライブラリ
はじめてのRuby拡張ライブラリはじめてのRuby拡張ライブラリ
はじめてのRuby拡張ライブラリ
 
研究動向から考えるx86/x64最適化手法
研究動向から考えるx86/x64最適化手法研究動向から考えるx86/x64最適化手法
研究動向から考えるx86/x64最適化手法
 

Viewers also liked

0円でできる自宅InfiniBandプログラム
0円でできる自宅InfiniBandプログラム0円でできる自宅InfiniBandプログラム
0円でできる自宅InfiniBandプログラムMinoru Nakamura
 
Persistent-Memory-Programming-Model
Persistent-Memory-Programming-ModelPersistent-Memory-Programming-Model
Persistent-Memory-Programming-ModelMinoru Nakamura
 
x86-64/Linuxに独自メモリ空間を勝手増設
x86-64/Linuxに独自メモリ空間を勝手増設x86-64/Linuxに独自メモリ空間を勝手増設
x86-64/Linuxに独自メモリ空間を勝手増設Minoru Nakamura
 
Concurrent Mark-Sweep Garbage Collection #jjug_ccc
Concurrent Mark-Sweep Garbage Collection #jjug_cccConcurrent Mark-Sweep Garbage Collection #jjug_ccc
Concurrent Mark-Sweep Garbage Collection #jjug_cccYuji Kubota
 
2012年javaメモリリーク
2012年javaメモリリーク2012年javaメモリリーク
2012年javaメモリリークtorutk
 
Garbage First and you
Garbage First and youGarbage First and you
Garbage First and youKai Koenig
 
UseNUMA做了什么?(2012-03-14)
UseNUMA做了什么?(2012-03-14)UseNUMA做了什么?(2012-03-14)
UseNUMA做了什么?(2012-03-14)Kris Mok
 
プログラマ目線から見たRDMAのメリットと その応用例について
プログラマ目線から見たRDMAのメリットとその応用例についてプログラマ目線から見たRDMAのメリットとその応用例について
プログラマ目線から見たRDMAのメリットと その応用例についてMasanori Itoh
 
低遅延Ethernetとファブリックによるデータセンタ・ネットワーク
低遅延Ethernetとファブリックによるデータセンタ・ネットワーク低遅延Ethernetとファブリックによるデータセンタ・ネットワーク
低遅延Ethernetとファブリックによるデータセンタ・ネットワークNaoto MATSUMOTO
 
シーサーでのInfiniBand導入事例
シーサーでのInfiniBand導入事例シーサーでのInfiniBand導入事例
シーサーでのInfiniBand導入事例Naoto MATSUMOTO
 
クラスローダーについて
クラスローダーについてクラスローダーについて
クラスローダーについてSuguru ARAKAWA
 
ioDriceとInfiniBandとDRBDを利用したリアルタイムレプリケーション
ioDriceとInfiniBandとDRBDを利用したリアルタイムレプリケーションioDriceとInfiniBandとDRBDを利用したリアルタイムレプリケーション
ioDriceとInfiniBandとDRBDを利用したリアルタイムレプリケーションIwasaki Noboru
 
InfiniBand Presentation
InfiniBand PresentationInfiniBand Presentation
InfiniBand PresentationShekhar Kumar
 
Tuning Java for Big Data
Tuning Java for Big DataTuning Java for Big Data
Tuning Java for Big DataScott Seighman
 
Garbage First Garbage Collection (G1 GC) #jjug_ccc #ccc_cd6
Garbage First Garbage Collection (G1 GC) #jjug_ccc #ccc_cd6Garbage First Garbage Collection (G1 GC) #jjug_ccc #ccc_cd6
Garbage First Garbage Collection (G1 GC) #jjug_ccc #ccc_cd6Yuji Kubota
 

Viewers also liked (20)

0円でできる自宅InfiniBandプログラム
0円でできる自宅InfiniBandプログラム0円でできる自宅InfiniBandプログラム
0円でできる自宅InfiniBandプログラム
 
Jvm reading-parallel gc
Jvm reading-parallel gcJvm reading-parallel gc
Jvm reading-parallel gc
 
Persistent-Memory-Programming-Model
Persistent-Memory-Programming-ModelPersistent-Memory-Programming-Model
Persistent-Memory-Programming-Model
 
x86-64/Linuxに独自メモリ空間を勝手増設
x86-64/Linuxに独自メモリ空間を勝手増設x86-64/Linuxに独自メモリ空間を勝手増設
x86-64/Linuxに独自メモリ空間を勝手増設
 
Concurrent Mark-Sweep Garbage Collection #jjug_ccc
Concurrent Mark-Sweep Garbage Collection #jjug_cccConcurrent Mark-Sweep Garbage Collection #jjug_ccc
Concurrent Mark-Sweep Garbage Collection #jjug_ccc
 
2012年javaメモリリーク
2012年javaメモリリーク2012年javaメモリリーク
2012年javaメモリリーク
 
Garbage First and you
Garbage First and youGarbage First and you
Garbage First and you
 
UseNUMA做了什么?(2012-03-14)
UseNUMA做了什么?(2012-03-14)UseNUMA做了什么?(2012-03-14)
UseNUMA做了什么?(2012-03-14)
 
Java VM as Stackmahine
Java VM as StackmahineJava VM as Stackmahine
Java VM as Stackmahine
 
Dentoo.LT12 並列処理・MPIの第一歩 20151025
Dentoo.LT12 並列処理・MPIの第一歩 20151025Dentoo.LT12 並列処理・MPIの第一歩 20151025
Dentoo.LT12 並列処理・MPIの第一歩 20151025
 
SC16 NVIDIA NEWS
SC16 NVIDIA NEWSSC16 NVIDIA NEWS
SC16 NVIDIA NEWS
 
プログラマ目線から見たRDMAのメリットと その応用例について
プログラマ目線から見たRDMAのメリットとその応用例についてプログラマ目線から見たRDMAのメリットとその応用例について
プログラマ目線から見たRDMAのメリットと その応用例について
 
低遅延Ethernetとファブリックによるデータセンタ・ネットワーク
低遅延Ethernetとファブリックによるデータセンタ・ネットワーク低遅延Ethernetとファブリックによるデータセンタ・ネットワーク
低遅延Ethernetとファブリックによるデータセンタ・ネットワーク
 
シーサーでのInfiniBand導入事例
シーサーでのInfiniBand導入事例シーサーでのInfiniBand導入事例
シーサーでのInfiniBand導入事例
 
クラスローダーについて
クラスローダーについてクラスローダーについて
クラスローダーについて
 
MPIによる並列計算
MPIによる並列計算MPIによる並列計算
MPIによる並列計算
 
ioDriceとInfiniBandとDRBDを利用したリアルタイムレプリケーション
ioDriceとInfiniBandとDRBDを利用したリアルタイムレプリケーションioDriceとInfiniBandとDRBDを利用したリアルタイムレプリケーション
ioDriceとInfiniBandとDRBDを利用したリアルタイムレプリケーション
 
InfiniBand Presentation
InfiniBand PresentationInfiniBand Presentation
InfiniBand Presentation
 
Tuning Java for Big Data
Tuning Java for Big DataTuning Java for Big Data
Tuning Java for Big Data
 
Garbage First Garbage Collection (G1 GC) #jjug_ccc #ccc_cd6
Garbage First Garbage Collection (G1 GC) #jjug_ccc #ccc_cd6Garbage First Garbage Collection (G1 GC) #jjug_ccc #ccc_cd6
Garbage First Garbage Collection (G1 GC) #jjug_ccc #ccc_cd6
 

Similar to JVM-Reading-ConcurrentMarkSweep

1072: アプリケーション開発を加速するCUDAライブラリ
1072: アプリケーション開発を加速するCUDAライブラリ1072: アプリケーション開発を加速するCUDAライブラリ
1072: アプリケーション開発を加速するCUDAライブラリNVIDIA Japan
 
Rのデータ構造とメモリ管理
Rのデータ構造とメモリ管理Rのデータ構造とメモリ管理
Rのデータ構造とメモリ管理Takeshi Arabiki
 
あるRISC-V CPUの 浮動小数点数(異常なし)
あるRISC-V CPUの 浮動小数点数(異常なし)あるRISC-V CPUの 浮動小数点数(異常なし)
あるRISC-V CPUの 浮動小数点数(異常なし)たけおか しょうぞう
 
Wavelet matrix implementation
Wavelet matrix implementationWavelet matrix implementation
Wavelet matrix implementationMITSUNARI Shigeo
 
lispmeetup#63 Common Lispでゼロから作るDeep Learning
lispmeetup#63 Common Lispでゼロから作るDeep Learninglispmeetup#63 Common Lispでゼロから作るDeep Learning
lispmeetup#63 Common Lispでゼロから作るDeep LearningSatoshi imai
 
JVM的な何か@JVM Operation Casual Talk
JVM的な何か@JVM Operation Casual TalkJVM的な何か@JVM Operation Casual Talk
JVM的な何か@JVM Operation Casual TalkShinpei Ohtani
 
第11回 配信講義 計算科学技術特論B(2022)
第11回 配信講義 計算科学技術特論B(2022)第11回 配信講義 計算科学技術特論B(2022)
第11回 配信講義 計算科学技術特論B(2022)RCCSRENKEI
 
GCをみればRTSが見えてくる、かも。。。
GCをみればRTSが見えてくる、かも。。。GCをみればRTSが見えてくる、かも。。。
GCをみればRTSが見えてくる、かも。。。dec9ue
 
Javaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組みJavaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組みChihiro Ito
 
小二病でもGCやりたい
小二病でもGCやりたい小二病でもGCやりたい
小二病でもGCやりたいdec9ue
 
Kink: invokedynamic on a prototype-based language
Kink: invokedynamic on a prototype-based languageKink: invokedynamic on a prototype-based language
Kink: invokedynamic on a prototype-based languageTaku Miyakawa
 
NVIDIA Japan Seminar 2012
NVIDIA Japan Seminar 2012NVIDIA Japan Seminar 2012
NVIDIA Japan Seminar 2012Takuro Iizuka
 
CUDA1日(?)体験会 (再アップロード)
CUDA1日(?)体験会 (再アップロード)CUDA1日(?)体験会 (再アップロード)
CUDA1日(?)体験会 (再アップロード)RinKuriyama
 

Similar to JVM-Reading-ConcurrentMarkSweep (20)

optimal Ate pairing
optimal Ate pairingoptimal Ate pairing
optimal Ate pairing
 
1072: アプリケーション開発を加速するCUDAライブラリ
1072: アプリケーション開発を加速するCUDAライブラリ1072: アプリケーション開発を加速するCUDAライブラリ
1072: アプリケーション開発を加速するCUDAライブラリ
 
Rのデータ構造とメモリ管理
Rのデータ構造とメモリ管理Rのデータ構造とメモリ管理
Rのデータ構造とメモリ管理
 
あるRISC-V CPUの 浮動小数点数(異常なし)
あるRISC-V CPUの 浮動小数点数(異常なし)あるRISC-V CPUの 浮動小数点数(異常なし)
あるRISC-V CPUの 浮動小数点数(異常なし)
 
Math works gdlc2019
Math works gdlc2019Math works gdlc2019
Math works gdlc2019
 
Wavelet matrix implementation
Wavelet matrix implementationWavelet matrix implementation
Wavelet matrix implementation
 
20130819 jjugnslt
20130819 jjugnslt20130819 jjugnslt
20130819 jjugnslt
 
lispmeetup#63 Common Lispでゼロから作るDeep Learning
lispmeetup#63 Common Lispでゼロから作るDeep Learninglispmeetup#63 Common Lispでゼロから作るDeep Learning
lispmeetup#63 Common Lispでゼロから作るDeep Learning
 
JVM的な何か@JVM Operation Casual Talk
JVM的な何か@JVM Operation Casual TalkJVM的な何か@JVM Operation Casual Talk
JVM的な何か@JVM Operation Casual Talk
 
第11回 配信講義 計算科学技術特論B(2022)
第11回 配信講義 計算科学技術特論B(2022)第11回 配信講義 計算科学技術特論B(2022)
第11回 配信講義 計算科学技術特論B(2022)
 
GCをみればRTSが見えてくる、かも。。。
GCをみればRTSが見えてくる、かも。。。GCをみればRTSが見えてくる、かも。。。
GCをみればRTSが見えてくる、かも。。。
 
Javaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組みJavaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組み
 
小二病でもGCやりたい
小二病でもGCやりたい小二病でもGCやりたい
小二病でもGCやりたい
 
KVM+cgroup
KVM+cgroupKVM+cgroup
KVM+cgroup
 
Kink: invokedynamic on a prototype-based language
Kink: invokedynamic on a prototype-based languageKink: invokedynamic on a prototype-based language
Kink: invokedynamic on a prototype-based language
 
Fxxking gc.c
Fxxking gc.cFxxking gc.c
Fxxking gc.c
 
NVIDIA Japan Seminar 2012
NVIDIA Japan Seminar 2012NVIDIA Japan Seminar 2012
NVIDIA Japan Seminar 2012
 
Kansai mrb gr_sakura
Kansai mrb gr_sakuraKansai mrb gr_sakura
Kansai mrb gr_sakura
 
TVM の紹介
TVM の紹介TVM の紹介
TVM の紹介
 
CUDA1日(?)体験会 (再アップロード)
CUDA1日(?)体験会 (再アップロード)CUDA1日(?)体験会 (再アップロード)
CUDA1日(?)体験会 (再アップロード)
 

Recently uploaded

論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 

Recently uploaded (9)

論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 

JVM-Reading-ConcurrentMarkSweep

  • 1. Concurrent Mark&Sweep 第6回JVMソースコードリーディングの会(OpenJDK) 中村 実 nminoru@nminoru.jp nminoru1975@gmail.com Twitter @nminoru_jp 1
  • 2. 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 Java threads GC threads GC threads
  • 3. Concurrent GC • メリット – Javaが常に動けるのでGCによる停止がない。 • デメリット – 機構が複雑になり、JavaスレッドとGCスレッド が邪魔しあうのでスループット性能が落ちる。
  • 4. Hotspot VMのConcurrent GC • Mostly Concurrent Mark & Sweep(CMS) – ほとんどconcurrentだが一部停止するGC – Tony Printezis, David Detlefs. A Generational Mostly-concurrent Garbage Collection (ISMM 2000) GC Mostly Concurrent GC Java threads GC threads 4
  • 5. CMS • Mark&Sweep – Marking phase • Concurrent marking • Serial marking(Hotspot VMの用語でfinal marking) – Sweeping phase • Concurrent sweeping 5
  • 6. Concurrent Marking(1/3) • Marking threadはrootから初めてオブジェクトを巡回し マーキングする(着色したオブジェクトはマークをあらわ す) • Javaスレッドはその間も動いて、オブジェクトを生成・参 照の変更を行う。 Heap Root 2 3 5 1 4 6
  • 7. Concurrent Marking(2/3) • Marking threadとJavaスレッドが同時に動くと衝突が発生 – (A) 余分なマーク • 3をマークし後に2→3の参照が切れた。 – (B) マーク漏れ • 1をマークした後に6が作られた。 • (A)はGCが回収する量が減るだけだが、(B)は許されない。 Heap (A) Root 2 3 5 1 4 (B) 6 7
  • 8. Concurrent Marking(3/3) • Write barrier – Javaスレッドがputfield/putstaticなどを実行した時 に、そのrecieverにライトバリアを付ける。 (A.field = B なら A にライトバリア) • Serial marking – Concurrent markingの後にSTWを起こしてライトバ リアがついている場所から残りのmarkingを行う。 8
  • 10. OpenJDKのGCの種類 オプション ヒープのクラス 空間のクラス 逐次GC -XX:+UseSerialGC GenCollectedHeap DefNewGeneration TenuredGeneration 並列GC -XX:+UseParNewGC GenCollectedHeap ParNewGeneration TenuredGeneration 並列GC -XX:+UseParallelGC ParallelScavengeHeap コンカレントGC -Xconcgc or GenCollectedHeap ParNewGeneration -XX:+UseConcMarkSweepGC ConcurrentMarkSweep インクリメンタ -Xincgc GenCollectedHeap 同上 ルGC (コンカレントGCに- XX:+CMSIncrementalMod eをつけたもの) G1GC -XX:+UseG1GC G1CollectedHeap 10
  • 11. CMSのオプション オプション 説明 -Xconcgc or Concurrent GCを有効にする。 -XX:+UseConcMarkSweepGC -XX:ConcGCThreads=<n> Concurrent GCスレッド数を指定する。 デフォルトは0でConcurrent GCスレッドは1となる。 -XX:+CMSParallelRemarkEnabled CMS Full GCをマルチスレッドで実行する。 マルチCPU環境ではデフォルトで指定される。 -XX:CMSWaitDuration=<n> 同期型のGCが起きた後に<n>ミリ秒経った後にCMSを開始 する。デフォルトは2000ミリ秒。 -XX:+PrintGC GCの詳細を表示する。 -XX:+PrintGCDetails -XX:+TraceCMSState Concurrent Mark&Sweepに関係する出力を増やす(デバッグ 版のみ)。 hotspot/src/share/vm/runtime/globals.hppに多数存在。 11
  • 12. Hotspot VMのCMSの概要 • ConcurrentMarkSweepThreadスレッドが全 体を制御 • ヒープ空間は新旧2世代 • Write barrierはCard markingで代替 • CMSのマーキングはビットマーキング 12
  • 13. ヒープ構成 • 空間配置 Perm – 新世代はParNewGC(parallel copying GC)用。 – 旧世代はCMS用でフリーリスト管理さ Old Gen. れている。 • GC – 最初に新世代にParNewGCを起こす (STW型) From To – 次に旧世代にCMS GCを起こす。 Eden – それでも不足の場合はCMS Full GC を起こす(STW型) 13
  • 14. Card Makingの流用 Old Gen. • Concurrent markingのためにはライト バリアが必要。でも世代別GCには似 dirty A たような処理があるので流用 • Card Table clean B – 512バイト単位に1バイトのバイトテーブル – Clean cardは0xFF、dirty cardは0 Card Table – 本来は旧世代から新世代を指すオブジェ クトの位置を記録 New Gen. • putfield/putstatic/aastoreにフック – A.field = B実行時になら CardTableModRefBS::byte_map_base [uintptr_t(A) >> CardTableModRefBS::card_shift] = 0 14
  • 15. CMS GCとParNewGCの競合 • マーキング領域 – CMSのマーキングは専用のビットマップを使う (CMSBitMap)ので問題なし。 • GC – ConcurrentMarkSweepThreadスレッドが動いている最 中にParNewGCが起きることがある。 その場合はConcurrentMarkSweepThreadが一時停止 してから再開する。 ParNew GC CMS GC Java threads Parallel GC thr Conc GC thr 15
  • 16. CMSのフェーズ - ConcurrentMarkSweepThread::run at concurrentMarkSweepThread.cpp:128 - CMSCollector::collect_in_background at concurrentMarkSweepGeneration.cpp:2246 1 InitialMarking (STW)Rootからのマーキング VM_CMS_Initial_Mark::doit() 2 Marking 通常のconcurrent marking CMSCollector::markFromRoots() 3 Precleaning 弱参照系のconcurrent marking CMSCollector::preclean() 4 AbortablePreclean CMSCollector::abortable_preclean() 5 FinalMarking (STW)Markingの残り VM_CMS_Final_Remark::doit() 6 Sweeping 回収 CMSCollector::sweep 7 Resizing 空間のサイズ調整 CMSCollector::compute_new_size 8 Resetting ビットマップのクリアなど CMSCollector::reset 9 Idling CMSWaitDurationミリ秒待機 3と4の処理は省略されることがある。 16
  • 17. InitialMarking • RootからのマークはSTWで行う。 • ConcurrentMarkSweepThreadスレッドが指示を出すが、実際の処理 はVMThreadが行う。 #0 CMSBitMap::mark() at globalDefinitions.hpp:418 #1 MarkRefsIntoClosure::do_oop() at concurrentMarkSweepGeneration.cpp:6586 #2 MarkRefsIntoClosure::do_oop_work<oopDesc*>(oopDesc**) at hotspot/src/share/vm/utilities/globalDefinitions.hpp:418 #3 MarkRefsIntoClosure::do_oop() at concurrentMarkSweepGeneration.cpp:6590 #4 Universe::oops_do() at hotspot/src/share/vm/memory/universe.cpp:208 #5 SharedHeap::process_strong_roots() at hotspot/src/share/vm/memory/sharedHeap.cpp:139 #6 GenCollectedHeap::gen_process_strong_roots() at hotspot/src/share/vm/memory/genCollectedHeap.cpp:741 #7 CMSCollector::checkpointRootsInitialWork() at concurrentMarkSweepGeneration.cpp:3570 #8 CMSCollector::checkpointRootsInitial() at concurrentMarkSweepGeneration.cpp:3489 #9 CMSCollector::do_CMS_operation() atconcurrentMarkSweepGeneration.cpp:6306 #10 VM_CMS_Initial_Mark::doit() at concurrentMarkSweep/vmCMSOperations.cpp:140 #11 VM_Operation::evaluate() at hotspot/src/share/vm/runtime/vm_operations.cpp:65 17
  • 18. Marking #0 CMSBitMap::mark() at globalDefinitions.hpp:418 #1 PushOrMarkClosure::do_oop() at concurrentMarkSweepGeneration.cpp:7555 #2 PushOrMarkClosure::do_oop_work<oopDesc*>(oopDesc**) at globalDefinitions.hpp:418 #3 PushOrMarkClosure::do_oop_nv(oopDesc**) () at hotspot/src/share/vm/runtime/thread.hpp:1826 #4 instanceKlass::oop_oop_iterate_nv() at hotspot/src/share/vm/oops/instanceKlass.cpp:1825 #5 instanceRefKlass::oop_oop_iterate_nv() at hotspot/src/share/vm/oops/instanceRefKlass.cpp:285 #6 oopDesc::oop_iterate() at /globalDefinitions.hpp:418 #7 MarkFromRootsClosure::scanOopsInOop() at concurrentMarkSweepGeneration.cpp:7215 #8 MarkFromRootsClosure::do_bit() at concurrentMarkSweepGeneration.cpp:7113 #9 BitMap::iterate() at hotspot/src/share/vm/utilities/bitMap.cpp:512 #10 BitMap::iterate() at globalDefinitions.hpp:418 #11 CMSBitMap::iterate() at globalDefinitions.hpp:418 #12 CMSCollector::do_marking_st() at concurrentMarkSweepGeneration.cpp:4325 #13 CMSCollector::markFromRootsWork() at concurrentMarkSweepGeneration.cpp:3692 #14 CMSCollector::markFromRoots() at concurrentMarkSweepGeneration.cpp:3629 #15 CMSCollector::collect_in_background() at concurrentMarkSweepGeneration.cpp:2288 #16 ConcurrentMarkSweepThread::run() at concurrentMarkSweepThread.cpp:128 18
  • 19. Preclean #0 CMSDrainMarkingStackClosure::do_void() at concurrentMarkSweepGeneration.cpp:8638 #1 ReferenceProcessor::preclean_discovered_reflist() at hotspot/src/share/vm/memory/referenceProcessor.cpp:1433 #2 ReferenceProcessor::preclean_discovered_references() at hotspot/src/share/vm/memory/referenceProcessor.cpp:1345 #3 CMSCollector::preclean_work() at concurrentMarkSweepGeneration.cpp:4542 #4 CMSCollector::preclean() at concurrentMarkSweepGeneration.cpp:4376 #5 CMSCollector::collect_in_background() at concurrentMarkSweepGeneration.cpp:2300 #6 ConcurrentMarkSweepThread::run() at concurrentMarkSweepThread.cpp:128 19
  • 20. FinalMarking • Markingの最後はSTWして行う。 • Card markingによってdirty cardがある場所のみをマークする。 #0 CMSBitMap::mark_range() at hotspot/src/share/vm/memory/cardTableRS.hpp:150 #1 CardTableModRefBS::dirty_card_iterate() at hotspot/src/share/vm/memory/cardTableModRefBS.cpp:617 #2 CMSParRemarkTask::do_dirty_card_rescan_tasks() at concurrentMarkSweepGeneration.cpp:5322 #3 CMSParRemarkTask::work() at concurrentMarkSweepGeneration.cpp:5171 #4 GangWorker::loop() at hotspot/src/share/vm/utilities/workgroup.cpp:308 #5 GangWorker::run() at OpenJDK/hotspot/src/share/vm/utilities/workgroup.cpp:224 #6 java_start() at OpenJDK/hotspot/src/os/linux/vm/os_linux.cpp:852 20
  • 21. Sweep(1/3) • CMSCollector::sweep at concurrentMarkSweepGeneration.cpp:5976 void CMSCollector::sweep(bool asynch) { // PermGen の sweep が禁止されていた場合でも無効なオブジェクトを // _perm_gen_verify_bit_map BitMap に移す。 MarkDeadObjectsClosure mdo(this, _permGen->cmsSpace(), markBitMap(), perm_gen_verify_bit_map()); _permGen->cmsSpace()->blk_iterate(&mdo); // Sweep 処理 sweepWork(_permGen, asynch); 21
  • 22. Sweep(2/3) concurrentMarkSweepGeneration.cpp:9214 size_t MarkDeadObjectsClosure::do_blk(HeapWord* addr) { size_t res = _sp->block_size_no_stall(addr, _collector); if (_sp->block_is_obj(addr)) { if (_live_bit_map->isMarked(addr)) { } else { _dead_bit_map->mark(addr); // mark the dead object } } return res; } #0 MarkDeadObjectsClosure::do_blk() at concurrentMarkSweepGeneration.cpp:9214 #1 CompactibleFreeListSpace::blk_iterate() at concurrentMarkSweep/compactibleFreeListSpace.cpp:771 #2 CMSCollector::sweep() at concurrentMarkSweepGeneration.cpp:6000 #3 CMSCollector::collect_in_background() at concurrentMarkSweepGeneration.cpp:2333 #4 ConcurrentMarkSweepThread::run() at concurrentMarkSweepThread.cpp:128 22
  • 23. Sweep(3/3) #0 SweepClosure::do_yield_work() at concurrentMarkSweepGeneration.cpp:8435 #1 SweepClosure::do_yield_check(HeapWord*) at hotspot/src/share/vm/utilities/globalDefinitions.hpp:418 #2 SweepClosure::do_blk_careful() at concurrentMarkSweepGeneration.cpp:8017 #3 CompactibleFreeListSpace::blk_iterate_careful() at concurrentMarkSweep/compactibleFreeListSpace.cpp:763 #4 CMSCollector::sweepWork() at concurrentMarkSweepGeneration.cpp:6201 #5 CMSCollector::sweep() at concurrentMarkSweepGeneration.cpp:6018 #6 CMSCollector::collect_in_background() at concurrentMarkSweepGeneration.cpp:2333 #7 ConcurrentMarkSweepThread::run() at concurrentMarkSweepThread.cpp:128 23