際際滷

際際滷Share a Scribd company logo
Concurrent Mark&Sweep
及6指JVMソ`スコ`ドリ`ディングの氏(OpenJDK)

              嶄翫 g
        nminoru@nminoru.jp
      nminoru1975@gmail.com
       Twitter @nminoru_jp

                                1
Parallel GCとConcurrent GC
   ? Stop the world(STW)侏GC
       C Javaスレッド(Mutator)を峭めてからGC
       C Parallel GCはSTWした瘁のGCI尖を}方のスレッドが蛍
         毅
   ? Concurrent GC
       C JavaスレッドとGCスレッドが揖rに咾

 Parallel GC         GC       Concurrent GC

Java threads                  Java threads

GC threads                    GC threads
Concurrent GC
? メリット
 C Javaが械に咾韻襪里GCによる唯峭がない。
? デメリット
 C Cが}jになり、JavaスレッドとGCスレッド
   が舒徴しあうのでスル`プット來嬬が鯛ちる。
Hotspot VMのConcurrent GC
   ? Mostly Concurrent Mark & Sweep(CMS)
       C ほとんどconcurrentだが匯何唯峭するGC
       C Tony Printezis, David Detlefs. A Generational
         Mostly-concurrent Garbage Collection (ISMM
         2000)
                           GC
Mostly Concurrent GC

Java threads

GC threads
                                                         4
CMS
? Mark&Sweep
  C Marking phase
    ? Concurrent marking
    ? Serial marking(Hotspot VMの喘Zでfinal marking)
  C Sweeping phase
    ? Concurrent sweeping




                                                5
Concurrent Marking(1/3)
? Marking threadはrootから兜めてオブジェクトを儔指し
  マ`キングする(彭弼したオブジェクトはマ`クをあらわ
  す)
? Javaスレッドはそのgも咾い董▲ブジェクトを伏撹?歌
  孚の筝を佩う。


        Heap
Root
                2    3     5
           1
                     4
                                   6
Concurrent Marking(2/3)
? Marking threadとJavaスレッドが揖rに咾とn融がk伏
   C (A) 噫蛍なマ`ク
       ? 3をマ`クし瘁に2★3の歌孚が俳れた。
   C (B) マ`ク息れ
       ? 1をマ`クした瘁に6が恬られた。
? (A)はGCが指Г垢訌燭pるだけだが、(B)はSされない。


          Heap         (A)
Root
                   2         3   5
             1
                             4
             (B)   6
                                        7
Concurrent Marking(3/3)
? Write barrier
  C Javaスレッドがputfield/putstaticなどをg佩したr
    に、そのrecieverにライトバリアを原ける。
    (A.field = B なら A にライトバリア)
? Serial marking
  C Concurrent markingの瘁にSTWを軟こしてライトバ
    リアがついている侭から火りのmarkingを佩う。



                                          8
OpenJDKでの CMSのg廾




                   9
或沿艶稼干禽悪の赫遺の嶽窃
                 オプション                  ヒ`プのクラス                腎gのクラス
幟肝GC       -XX:+UseSerialGC          GenCollectedHeap       DefNewGeneration
                                                            TenuredGeneration
K双GC       -XX:+UseParNewGC          GenCollectedHeap       ParNewGeneration
                                                            TenuredGeneration
K双GC       -XX:+UseParallelGC        ParallelScavengeHeap
コンカレントGC   -Xconcgc or               GenCollectedHeap       ParNewGeneration
           -XX:+UseConcMarkSweepGC                          ConcurrentMarkSweep

インクリメンタ    -Xincgc                   GenCollectedHeap       揖貧
ルGC        (コンカレントGCに-
           XX:+CMSIncrementalMod
           eをつけたもの)
G1GC       -XX:+UseG1GC              G1CollectedHeap
                                                                                10
遺珂皆のオプション
          オプション                                   h苧
-Xconcgc or                     Concurrent GCを嗤燭砲垢襦
-XX:+UseConcMarkSweepGC
-XX:ConcGCThreads=<n>           Concurrent GCスレッド方を峺協する。
                                デフォルトは0でConcurrent GCスレッドは1となる。
-XX:+CMSParallelRemarkEnabled   CMS Full GCをマルチスレッドでg佩する。
                                マルチCPUh廠ではデフォルトで峺協される。
-XX:CMSWaitDuration=<n>         揖豚侏のGCが軟きた瘁に<n>ミリ昼Uった瘁にCMSを_兵
                                する。デフォルトは2000ミリ昼。
-XX:+PrintGC                    GCのを燕幣する。
-XX:+PrintGCDetails
-XX:+TraceCMSState              Concurrent Mark&SweepにvSする竃薦をやす(デバッグ
                                井のみ)。

  hotspot/src/share/vm/runtime/globals.hppに謹方贋壓。
                                                                  11
Hotspot VMのCMSの古勣
? ConcurrentMarkSweepThreadスレッドが畠
  悶を崙囮
? ヒ`プ腎gは仟症2弊旗
? Write barrierはCard markingで旗紋
? CMSのマ`キングはビットマ`キング



                                    12
ヒ`プ撹
? 腎g塘崔                                 Perm
  C 仟弊旗はParNewGC(parallel copying
    GC)喘。
  C 症弊旗はCMS喘でフリ`リスト砿尖さ                Old Gen.
    れている。
? GC
  C 恷兜に仟弊旗にParNewGCを軟こす
    (STW侏)                          From      To

  C 肝に症弊旗にCMS GCを軟こす。                  Eden
  C それでも音怎の栽はCMS Full GC
    を軟こす(STW侏)
                                              13
Card Makingの送喘
                                                                                Old Gen.
 ? Concurrent markingのためにはライト
   バリアが駅勣。でも弊旗eGCには貌




                                                                                                dirty
                                                                                       A
   たようなI尖があるので送喘
 ? Card Table




                                                                                                clean
                                                                                  B
       C 512バイトg了に1バイトのバイトテ`ブル
       C Clean cardは0xFF、dirty cardは0




                                                                                                Card Table
       C 云栖は症弊旗から仟弊旗を峺すオブジェ
         クトの了崔をh                                                               New Gen.

 ? putfield/putstatic/aastoreにフック
       C A.field = Bg佩rになら

CardTableModRefBS::byte_map_base [uintptr_t(A) >> CardTableModRefBS::card_shift] = 0
                                                                                           14
CMS GCとParNewGCの栽
     ? マ`キングI囃
         C CMSのマ`キングは喘のビットマップを聞う
           (CMSBitMap)ので}なし。
     ? GC
         C ConcurrentMarkSweepThreadスレッドが咾い討い誚
           嶄にParNewGCが軟きることがある。
           その栽はConcurrentMarkSweepThreadが匯r唯峭
           してから壅_する。
                      ParNew GC    CMS GC

 Java threads
Parallel GC thr
 Conc GC thr                                  15
遺珂皆のフェ`ズ
    - 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            腎gのサイズ{屁                             CMSCollector::compute_new_size

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

9   Idling              CMSWaitDurationミリ昼棋C

3と4のI尖は福待されることがある。
                                                                                           16
InitialMarking
   ? Rootからのマ`クはSTWで佩う。
   ? ConcurrentMarkSweepThreadスレッドが峺幣を竃すが、gHのI尖
     は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 が鋤峭されていた栽でもo燭淵ブジェクトを
  // _perm_gen_verify_bit_map BitMap に卞す。
  MarkDeadObjectsClosure mdo(this, _permGen->cmsSpace(),
                 markBitMap(), perm_gen_verify_bit_map());

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

  // Sweep I尖
  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 (20)

C++ マルチスレット?フ?ロク?ラミンク?
C++ マルチスレット?フ?ロク?ラミンク?C++ マルチスレット?フ?ロク?ラミンク?
C++ マルチスレット?フ?ロク?ラミンク?
Kohsuke Yuasa
?
喘來と互堀來を朕峺したペアリング圧催ライブラリ mcl
喘來と互堀來を朕峺したペアリング圧催ライブラリ mcl喘來と互堀來を朕峺したペアリング圧催ライブラリ mcl
喘來と互堀來を朕峺したペアリング圧催ライブラリ mcl
MITSUNARI Shigeo
?
ゆるバグ
ゆるバグゆるバグ
ゆるバグ
MITSUNARI Shigeo
?
v|GPGPU茶氏 LLVM meets GPU
v|GPGPU茶氏 LLVM meets GPUv|GPGPU茶氏 LLVM meets GPU
v|GPGPU茶氏 LLVM meets GPU
Takuro Iizuka
?
SEH on mingw32
SEH on mingw32SEH on mingw32
SEH on mingw32
kikairoya
?
皆沿艶界岳姻艶/珂艶鉛岳糸看敬稼とその塗伏
皆沿艶界岳姻艶/珂艶鉛岳糸看敬稼とその塗伏皆沿艶界岳姻艶/珂艶鉛岳糸看敬稼とその塗伏
皆沿艶界岳姻艶/珂艶鉛岳糸看敬稼とその塗伏
MITSUNARI Shigeo
?
堰温壊敬艶鉛鉛サ`ベイと嗤淕絅ラスの府初
堰温壊敬艶鉛鉛サ`ベイと嗤淕絅ラスの府初堰温壊敬艶鉛鉛サ`ベイと嗤淕絅ラスの府初
堰温壊敬艶鉛鉛サ`ベイと嗤淕絅ラスの府初
MITSUNARI Shigeo
?
Effective Modern C++ i氏 Item 35
Effective Modern C++ i氏 Item 35Effective Modern C++ i氏 Item 35
Effective Modern C++ i氏 Item 35
Keisuke Fukuda
?
vジャバ JavaOne Tokyo 2012鷂羯
vジャバ JavaOne Tokyo 2012鷂羯vジャバ JavaOne Tokyo 2012鷂羯
vジャバ JavaOne Tokyo 2012鷂羯
Koichi Sakata
?
訳周蛍瓷と界馨看厩と馨温恰沿壊
訳周蛍瓷と界馨看厩と馨温恰沿壊訳周蛍瓷と界馨看厩と馨温恰沿壊
訳周蛍瓷と界馨看厩と馨温恰沿壊
MITSUNARI Shigeo
?
イマドキ遺++艶姻のモテカワリソ`ス砿尖宝
イマドキ遺++艶姻のモテカワリソ`ス砿尖宝イマドキ遺++艶姻のモテカワリソ`ス砿尖宝
イマドキ遺++艶姻のモテカワリソ`ス砿尖宝
Kohsuke Yuasa
?
プロセスとコンテキストスイッチ
プロセスとコンテキストスイッチプロセスとコンテキストスイッチ
プロセスとコンテキストスイッチ
Kazuki Onishi
?
LLVM overview 20110122
LLVM overview 20110122LLVM overview 20110122
LLVM overview 20110122
nothingcosmos
?
号鯉慕でiむ遺++11のスレッド
号鯉慕でiむ遺++11のスレッド号鯉慕でiむ遺++11のスレッド
号鯉慕でiむ遺++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 4
Ransui Iso
?
Visual C++コ`ド蛍裂を屶えるSAL
Visual C++コ`ド蛍裂を屶えるSALVisual C++コ`ド蛍裂を屶えるSAL
Visual C++コ`ド蛍裂を屶えるSAL
egtra
?
Effective Modern C++ 茶氏#3 Item16
Effective Modern C++ 茶氏#3 Item16Effective Modern C++ 茶氏#3 Item16
Effective Modern C++ 茶氏#3 Item16
Mitsuru Kariya
?
はじめての檎顎恢霞嫖ライブラリ
はじめての檎顎恢霞嫖ライブラリはじめての檎顎恢霞嫖ライブラリ
はじめての檎顎恢霞嫖ライブラリ
Masahiro Tomita
?
冩梢強鬚ら深える恰86/恰64恷癖晒返隈
冩梢強鬚ら深える恰86/恰64恷癖晒返隈冩梢強鬚ら深える恰86/恰64恷癖晒返隈
冩梢強鬚ら深える恰86/恰64恷癖晒返隈
Takeshi Yamamuro
?
C++ マルチスレット?フ?ロク?ラミンク?
C++ マルチスレット?フ?ロク?ラミンク?C++ マルチスレット?フ?ロク?ラミンク?
C++ マルチスレット?フ?ロク?ラミンク?
Kohsuke Yuasa
?
喘來と互堀來を朕峺したペアリング圧催ライブラリ mcl
喘來と互堀來を朕峺したペアリング圧催ライブラリ mcl喘來と互堀來を朕峺したペアリング圧催ライブラリ mcl
喘來と互堀來を朕峺したペアリング圧催ライブラリ mcl
MITSUNARI Shigeo
?
v|GPGPU茶氏 LLVM meets GPU
v|GPGPU茶氏 LLVM meets GPUv|GPGPU茶氏 LLVM meets GPU
v|GPGPU茶氏 LLVM meets GPU
Takuro Iizuka
?
皆沿艶界岳姻艶/珂艶鉛岳糸看敬稼とその塗伏
皆沿艶界岳姻艶/珂艶鉛岳糸看敬稼とその塗伏皆沿艶界岳姻艶/珂艶鉛岳糸看敬稼とその塗伏
皆沿艶界岳姻艶/珂艶鉛岳糸看敬稼とその塗伏
MITSUNARI Shigeo
?
堰温壊敬艶鉛鉛サ`ベイと嗤淕絅ラスの府初
堰温壊敬艶鉛鉛サ`ベイと嗤淕絅ラスの府初堰温壊敬艶鉛鉛サ`ベイと嗤淕絅ラスの府初
堰温壊敬艶鉛鉛サ`ベイと嗤淕絅ラスの府初
MITSUNARI Shigeo
?
Effective Modern C++ i氏 Item 35
Effective Modern C++ i氏 Item 35Effective Modern C++ i氏 Item 35
Effective Modern C++ i氏 Item 35
Keisuke Fukuda
?
vジャバ JavaOne Tokyo 2012鷂羯
vジャバ JavaOne Tokyo 2012鷂羯vジャバ JavaOne Tokyo 2012鷂羯
vジャバ JavaOne Tokyo 2012鷂羯
Koichi Sakata
?
訳周蛍瓷と界馨看厩と馨温恰沿壊
訳周蛍瓷と界馨看厩と馨温恰沿壊訳周蛍瓷と界馨看厩と馨温恰沿壊
訳周蛍瓷と界馨看厩と馨温恰沿壊
MITSUNARI Shigeo
?
イマドキ遺++艶姻のモテカワリソ`ス砿尖宝
イマドキ遺++艶姻のモテカワリソ`ス砿尖宝イマドキ遺++艶姻のモテカワリソ`ス砿尖宝
イマドキ遺++艶姻のモテカワリソ`ス砿尖宝
Kohsuke Yuasa
?
プロセスとコンテキストスイッチ
プロセスとコンテキストスイッチプロセスとコンテキストスイッチ
プロセスとコンテキストスイッチ
Kazuki Onishi
?
号鯉慕でiむ遺++11のスレッド
号鯉慕でiむ遺++11のスレッド号鯉慕でiむ遺++11のスレッド
号鯉慕でiむ遺++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 4
Ransui Iso
?
Visual C++コ`ド蛍裂を屶えるSAL
Visual C++コ`ド蛍裂を屶えるSALVisual C++コ`ド蛍裂を屶えるSAL
Visual C++コ`ド蛍裂を屶えるSAL
egtra
?
Effective Modern C++ 茶氏#3 Item16
Effective Modern C++ 茶氏#3 Item16Effective Modern C++ 茶氏#3 Item16
Effective Modern C++ 茶氏#3 Item16
Mitsuru Kariya
?
はじめての檎顎恢霞嫖ライブラリ
はじめての檎顎恢霞嫖ライブラリはじめての檎顎恢霞嫖ライブラリ
はじめての檎顎恢霞嫖ライブラリ
Masahiro Tomita
?
冩梢強鬚ら深える恰86/恰64恷癖晒返隈
冩梢強鬚ら深える恰86/恰64恷癖晒返隈冩梢強鬚ら深える恰86/恰64恷癖晒返隈
冩梢強鬚ら深える恰86/恰64恷癖晒返隈
Takeshi Yamamuro
?

Viewers also liked (20)

0劼任任る徭姙鴛稼韓庄稼庄京温稼糸プログラム
0劼任任る徭姙鴛稼韓庄稼庄京温稼糸プログラム0劼任任る徭姙鴛稼韓庄稼庄京温稼糸プログラム
0劼任任る徭姙鴛稼韓庄稼庄京温稼糸プログラム
Minoru Nakamura
?
Persistent-Memory-Programming-Model
Persistent-Memory-Programming-ModelPersistent-Memory-Programming-Model
Persistent-Memory-Programming-Model
Minoru Nakamura
?
恰86-64/晦庄稼顎恰に鏡徭メモリ腎寂を覆返譜
恰86-64/晦庄稼顎恰に鏡徭メモリ腎寂を覆返譜恰86-64/晦庄稼顎恰に鏡徭メモリ腎寂を覆返譜
恰86-64/晦庄稼顎恰に鏡徭メモリ腎寂を覆返譜
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_ccc
Yuji Kubota
?
2012定逮温厩温メモリリ`ク
2012定逮温厩温メモリリ`ク2012定逮温厩温メモリリ`ク
2012定逮温厩温メモリリ`ク
torutk
?
Garbage First and you
Garbage First and youGarbage First and you
Garbage First and you
Kai Koenig
?
雨壊艶鰻雨珂粥恂阻焚担殖2012-03-14
雨壊艶鰻雨珂粥恂阻焚担殖2012-03-14雨壊艶鰻雨珂粥恂阻焚担殖2012-03-14
雨壊艶鰻雨珂粥恂阻焚担殖2012-03-14
Kris Mok
?
Java VM as StackmahineJava VM as Stackmahine
Java VM as Stackmahine
Yuichi Sakuraba
?
Dentoo.LT12 K双I尖?MPIの及匯i 20151025
Dentoo.LT12 K双I尖?MPIの及匯i 20151025Dentoo.LT12 K双I尖?MPIの及匯i 20151025
Dentoo.LT12 K双I尖?MPIの及匯i 20151025
堰永遺システムズ幄塀氏芙
?
SC16 NVIDIA NEWS
SC16 NVIDIA NEWSSC16 NVIDIA NEWS
SC16 NVIDIA NEWS
Kuninobu SaSaki
?
プログラマ朕からたRDMAのメリットと その鮄胆について
プログラマ朕からたRDMAのメリットとその鮄胆についてプログラマ朕からたRDMAのメリットとその鮄胆について
プログラマ朕からたRDMAのメリットと その鮄胆について
Masanori Itoh
?
詰W决掘岳鞄艶姻稼艶岳とファブリックによるデ`タセンタ?ネットワ`ク
詰W决掘岳鞄艶姻稼艶岳とファブリックによるデ`タセンタ?ネットワ`ク詰W决掘岳鞄艶姻稼艶岳とファブリックによるデ`タセンタ?ネットワ`ク
詰W决掘岳鞄艶姻稼艶岳とファブリックによるデ`タセンタ?ネットワ`ク
Naoto MATSUMOTO
?
シ`サ`での鴛稼韓庄稼庄京温稼糸擬秘並箭
シ`サ`での鴛稼韓庄稼庄京温稼糸擬秘並箭シ`サ`での鴛稼韓庄稼庄京温稼糸擬秘並箭
シ`サ`での鴛稼韓庄稼庄京温稼糸擬秘並箭
Naoto MATSUMOTO
?
クラスロ`ダ`について
クラスロ`ダ`についてクラスロ`ダ`について
クラスロ`ダ`について
Suguru ARAKAWA
?
珂永鴛による旺双柴麻
珂永鴛による旺双柴麻珂永鴛による旺双柴麻
珂永鴛による旺双柴麻
堰永遺システムズ幄塀氏芙
?
庄看禽姻庄界艶と鴛稼韓庄稼庄京温稼糸と禽檎京禽を旋喘したリアルタイムレプリケ`ション
庄看禽姻庄界艶と鴛稼韓庄稼庄京温稼糸と禽檎京禽を旋喘したリアルタイムレプリケ`ション庄看禽姻庄界艶と鴛稼韓庄稼庄京温稼糸と禽檎京禽を旋喘したリアルタイムレプリケ`ション
庄看禽姻庄界艶と鴛稼韓庄稼庄京温稼糸と禽檎京禽を旋喘したリアルタイムレプリケ`ション
Iwasaki Noboru
?
InfiniBand Presentation
InfiniBand PresentationInfiniBand Presentation
InfiniBand Presentation
Shekhar Kumar
?
Tuning Java for Big Data
Tuning Java for Big DataTuning Java for Big Data
Tuning Java for Big Data
Scott 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_cd6
Yuji Kubota
?
0劼任任る徭姙鴛稼韓庄稼庄京温稼糸プログラム
0劼任任る徭姙鴛稼韓庄稼庄京温稼糸プログラム0劼任任る徭姙鴛稼韓庄稼庄京温稼糸プログラム
0劼任任る徭姙鴛稼韓庄稼庄京温稼糸プログラム
Minoru Nakamura
?
Persistent-Memory-Programming-Model
Persistent-Memory-Programming-ModelPersistent-Memory-Programming-Model
Persistent-Memory-Programming-Model
Minoru Nakamura
?
恰86-64/晦庄稼顎恰に鏡徭メモリ腎寂を覆返譜
恰86-64/晦庄稼顎恰に鏡徭メモリ腎寂を覆返譜恰86-64/晦庄稼顎恰に鏡徭メモリ腎寂を覆返譜
恰86-64/晦庄稼顎恰に鏡徭メモリ腎寂を覆返譜
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_ccc
Yuji Kubota
?
2012定逮温厩温メモリリ`ク
2012定逮温厩温メモリリ`ク2012定逮温厩温メモリリ`ク
2012定逮温厩温メモリリ`ク
torutk
?
Garbage First and you
Garbage First and youGarbage First and you
Garbage First and you
Kai Koenig
?
雨壊艶鰻雨珂粥恂阻焚担殖2012-03-14
雨壊艶鰻雨珂粥恂阻焚担殖2012-03-14雨壊艶鰻雨珂粥恂阻焚担殖2012-03-14
雨壊艶鰻雨珂粥恂阻焚担殖2012-03-14
Kris Mok
?
Java VM as StackmahineJava VM as Stackmahine
Java VM as Stackmahine
Yuichi Sakuraba
?
プログラマ朕からたRDMAのメリットと その鮄胆について
プログラマ朕からたRDMAのメリットとその鮄胆についてプログラマ朕からたRDMAのメリットとその鮄胆について
プログラマ朕からたRDMAのメリットと その鮄胆について
Masanori Itoh
?
詰W决掘岳鞄艶姻稼艶岳とファブリックによるデ`タセンタ?ネットワ`ク
詰W决掘岳鞄艶姻稼艶岳とファブリックによるデ`タセンタ?ネットワ`ク詰W决掘岳鞄艶姻稼艶岳とファブリックによるデ`タセンタ?ネットワ`ク
詰W决掘岳鞄艶姻稼艶岳とファブリックによるデ`タセンタ?ネットワ`ク
Naoto MATSUMOTO
?
シ`サ`での鴛稼韓庄稼庄京温稼糸擬秘並箭
シ`サ`での鴛稼韓庄稼庄京温稼糸擬秘並箭シ`サ`での鴛稼韓庄稼庄京温稼糸擬秘並箭
シ`サ`での鴛稼韓庄稼庄京温稼糸擬秘並箭
Naoto MATSUMOTO
?
クラスロ`ダ`について
クラスロ`ダ`についてクラスロ`ダ`について
クラスロ`ダ`について
Suguru ARAKAWA
?
庄看禽姻庄界艶と鴛稼韓庄稼庄京温稼糸と禽檎京禽を旋喘したリアルタイムレプリケ`ション
庄看禽姻庄界艶と鴛稼韓庄稼庄京温稼糸と禽檎京禽を旋喘したリアルタイムレプリケ`ション庄看禽姻庄界艶と鴛稼韓庄稼庄京温稼糸と禽檎京禽を旋喘したリアルタイムレプリケ`ション
庄看禽姻庄界艶と鴛稼韓庄稼庄京温稼糸と禽檎京禽を旋喘したリアルタイムレプリケ`ション
Iwasaki Noboru
?
InfiniBand Presentation
InfiniBand PresentationInfiniBand Presentation
InfiniBand Presentation
Shekhar Kumar
?
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
Yuji Kubota
?

Similar to JVM-Reading-ConcurrentMarkSweep (20)

optimal Ate pairing
optimal Ate pairingoptimal Ate pairing
optimal Ate pairing
MITSUNARI Shigeo
?
1072: アプリケ`ション_kを紗堀するCUDAライブラリ
1072: アプリケ`ション_kを紗堀するCUDAライブラリ1072: アプリケ`ション_kを紗堀するCUDAライブラリ
1072: アプリケ`ション_kを紗堀するCUDAライブラリ
NVIDIA Japan
?
檎のデ`タ更夛とメモリ砿尖
檎のデ`タ更夛とメモリ砿尖檎のデ`タ更夛とメモリ砿尖
檎のデ`タ更夛とメモリ砿尖
Takeshi Arabiki
?
あるRISC-V CPUの 検嗤(泣方(械なし)
あるRISC-V CPUの 検嗤(泣方(械なし)あるRISC-V CPUの 検嗤(泣方(械なし)
あるRISC-V CPUの 検嗤(泣方(械なし)
たけおか しょうぞう
?
Math works gdlc2019
Math works gdlc2019Math works gdlc2019
Math works gdlc2019
Hirokuni Uchida
?
Wavelet matrix implementation
Wavelet matrix implementationWavelet matrix implementation
Wavelet matrix implementation
MITSUNARI Shigeo
?
lispmeetup#63 Common Lispでゼロから恬るDeep Learning
lispmeetup#63 Common Lispでゼロから恬るDeep Learninglispmeetup#63 Common Lispでゼロから恬るDeep Learning
lispmeetup#63 Common Lispでゼロから恬るDeep Learning
Satoshi imai
?
JVM議な採か@JVM Operation Casual Talk
JVM議な採か@JVM Operation Casual TalkJVM議な採か@JVM Operation Casual Talk
JVM議な採か@JVM Operation Casual Talk
Shinpei Ohtani
?
及11指 塘佚vx 麻親僥室g蒙B2022
及11指 塘佚vx 麻親僥室g蒙B2022及11指 塘佚vx 麻親僥室g蒙B2022
及11指 塘佚vx 麻親僥室g蒙B2022
RCCSRENKEI
?
赫遺をみれば檎意皆が需えてくる、かも。。。
赫遺をみれば檎意皆が需えてくる、かも。。。赫遺をみれば檎意皆が需えてくる、かも。。。
赫遺をみれば檎意皆が需えてくる、かも。。。
dec9ue
?
干温厩温はどのように強くのか゛スライドでわかる干閣珂の碧怏み
干温厩温はどのように強くのか゛スライドでわかる干閣珂の碧怏み干温厩温はどのように強くのか゛スライドでわかる干閣珂の碧怏み
干温厩温はどのように強くのか゛スライドでわかる干閣珂の碧怏み
Chihiro Ito
?
弌屈押でも赫遺やりたい
弌屈押でも赫遺やりたい弌屈押でも赫遺やりたい
弌屈押でも赫遺やりたい
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 language
Taku Miyakawa
?
NVIDIA Japan Seminar 2012
NVIDIA Japan Seminar 2012NVIDIA Japan Seminar 2012
NVIDIA Japan Seminar 2012
Takuro Iizuka
?
Kansai mrb gr_sakura
Kansai mrb gr_sakuraKansai mrb gr_sakura
Kansai mrb gr_sakura
Kosuga Masakatsu
?
TVM のB初
TVM のB初TVM のB初
TVM のB初
Masahiro Masuda
?
CUDA1晩(?)悶Y氏 (壅アップロ`ド)
CUDA1晩(?)悶Y氏 (壅アップロ`ド)CUDA1晩(?)悶Y氏 (壅アップロ`ド)
CUDA1晩(?)悶Y氏 (壅アップロ`ド)
RinKuriyama
?
1072: アプリケ`ション_kを紗堀するCUDAライブラリ
1072: アプリケ`ション_kを紗堀するCUDAライブラリ1072: アプリケ`ション_kを紗堀するCUDAライブラリ
1072: アプリケ`ション_kを紗堀するCUDAライブラリ
NVIDIA Japan
?
檎のデ`タ更夛とメモリ砿尖
檎のデ`タ更夛とメモリ砿尖檎のデ`タ更夛とメモリ砿尖
檎のデ`タ更夛とメモリ砿尖
Takeshi Arabiki
?
Wavelet matrix implementation
Wavelet matrix implementationWavelet matrix implementation
Wavelet matrix implementation
MITSUNARI Shigeo
?
lispmeetup#63 Common Lispでゼロから恬るDeep Learning
lispmeetup#63 Common Lispでゼロから恬るDeep Learninglispmeetup#63 Common Lispでゼロから恬るDeep Learning
lispmeetup#63 Common Lispでゼロから恬るDeep Learning
Satoshi imai
?
JVM議な採か@JVM Operation Casual Talk
JVM議な採か@JVM Operation Casual TalkJVM議な採か@JVM Operation Casual Talk
JVM議な採か@JVM Operation Casual Talk
Shinpei Ohtani
?
及11指 塘佚vx 麻親僥室g蒙B2022
及11指 塘佚vx 麻親僥室g蒙B2022及11指 塘佚vx 麻親僥室g蒙B2022
及11指 塘佚vx 麻親僥室g蒙B2022
RCCSRENKEI
?
赫遺をみれば檎意皆が需えてくる、かも。。。
赫遺をみれば檎意皆が需えてくる、かも。。。赫遺をみれば檎意皆が需えてくる、かも。。。
赫遺をみれば檎意皆が需えてくる、かも。。。
dec9ue
?
干温厩温はどのように強くのか゛スライドでわかる干閣珂の碧怏み
干温厩温はどのように強くのか゛スライドでわかる干閣珂の碧怏み干温厩温はどのように強くのか゛スライドでわかる干閣珂の碧怏み
干温厩温はどのように強くのか゛スライドでわかる干閣珂の碧怏み
Chihiro Ito
?
弌屈押でも赫遺やりたい
弌屈押でも赫遺やりたい弌屈押でも赫遺やりたい
弌屈押でも赫遺やりたい
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 language
Taku Miyakawa
?
NVIDIA Japan Seminar 2012
NVIDIA Japan Seminar 2012NVIDIA Japan Seminar 2012
NVIDIA Japan Seminar 2012
Takuro Iizuka
?
CUDA1晩(?)悶Y氏 (壅アップロ`ド)
CUDA1晩(?)悶Y氏 (壅アップロ`ド)CUDA1晩(?)悶Y氏 (壅アップロ`ド)
CUDA1晩(?)悶Y氏 (壅アップロ`ド)
RinKuriyama
?

JVM-Reading-ConcurrentMarkSweep

  • 1. Concurrent Mark&Sweep 及6指JVMソ`スコ`ドリ`ディングの氏(OpenJDK) 嶄翫 g nminoru@nminoru.jp nminoru1975@gmail.com Twitter @nminoru_jp 1
  • 2. Parallel GCとConcurrent GC ? Stop the world(STW)侏GC C Javaスレッド(Mutator)を峭めてからGC C Parallel GCはSTWした瘁のGCI尖を}方のスレッドが蛍 毅 ? Concurrent GC C JavaスレッドとGCスレッドが揖rに咾 Parallel GC GC Concurrent GC Java threads Java threads GC threads GC threads
  • 3. Concurrent GC ? メリット C Javaが械に咾韻襪里GCによる唯峭がない。 ? デメリット C Cが}jになり、JavaスレッドとGCスレッド が舒徴しあうのでスル`プット來嬬が鯛ちる。
  • 4. Hotspot VMのConcurrent GC ? Mostly Concurrent Mark & Sweep(CMS) C ほとんどconcurrentだが匯何唯峭するGC C 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 C Marking phase ? Concurrent marking ? Serial marking(Hotspot VMの喘Zでfinal marking) C Sweeping phase ? Concurrent sweeping 5
  • 6. Concurrent Marking(1/3) ? Marking threadはrootから兜めてオブジェクトを儔指し マ`キングする(彭弼したオブジェクトはマ`クをあらわ す) ? Javaスレッドはそのgも咾い董▲ブジェクトを伏撹?歌 孚の筝を佩う。 Heap Root 2 3 5 1 4 6
  • 7. Concurrent Marking(2/3) ? Marking threadとJavaスレッドが揖rに咾とn融がk伏 C (A) 噫蛍なマ`ク ? 3をマ`クし瘁に2★3の歌孚が俳れた。 C (B) マ`ク息れ ? 1をマ`クした瘁に6が恬られた。 ? (A)はGCが指Г垢訌燭pるだけだが、(B)はSされない。 Heap (A) Root 2 3 5 1 4 (B) 6 7
  • 8. Concurrent Marking(3/3) ? Write barrier C Javaスレッドがputfield/putstaticなどをg佩したr に、そのrecieverにライトバリアを原ける。 (A.field = B なら A にライトバリア) ? Serial marking C Concurrent markingの瘁にSTWを軟こしてライトバ リアがついている侭から火りのmarkingを佩う。 8
  • 10. 或沿艶稼干禽悪の赫遺の嶽窃 オプション ヒ`プのクラス 腎gのクラス 幟肝GC -XX:+UseSerialGC GenCollectedHeap DefNewGeneration TenuredGeneration K双GC -XX:+UseParNewGC GenCollectedHeap ParNewGeneration TenuredGeneration K双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. 遺珂皆のオプション オプション h苧 -Xconcgc or Concurrent GCを嗤燭砲垢襦 -XX:+UseConcMarkSweepGC -XX:ConcGCThreads=<n> Concurrent GCスレッド方を峺協する。 デフォルトは0でConcurrent GCスレッドは1となる。 -XX:+CMSParallelRemarkEnabled CMS Full GCをマルチスレッドでg佩する。 マルチCPUh廠ではデフォルトで峺協される。 -XX:CMSWaitDuration=<n> 揖豚侏のGCが軟きた瘁に<n>ミリ昼Uった瘁にCMSを_兵 する。デフォルトは2000ミリ昼。 -XX:+PrintGC GCのを燕幣する。 -XX:+PrintGCDetails -XX:+TraceCMSState Concurrent Mark&SweepにvSする竃薦をやす(デバッグ 井のみ)。 hotspot/src/share/vm/runtime/globals.hppに謹方贋壓。 11
  • 12. Hotspot VMのCMSの古勣 ? ConcurrentMarkSweepThreadスレッドが畠 悶を崙囮 ? ヒ`プ腎gは仟症2弊旗 ? Write barrierはCard markingで旗紋 ? CMSのマ`キングはビットマ`キング 12
  • 13. ヒ`プ撹 ? 腎g塘崔 Perm C 仟弊旗はParNewGC(parallel copying GC)喘。 C 症弊旗はCMS喘でフリ`リスト砿尖さ Old Gen. れている。 ? GC C 恷兜に仟弊旗にParNewGCを軟こす (STW侏) From To C 肝に症弊旗にCMS GCを軟こす。 Eden C それでも音怎の栽はCMS Full GC を軟こす(STW侏) 13
  • 14. Card Makingの送喘 Old Gen. ? Concurrent markingのためにはライト バリアが駅勣。でも弊旗eGCには貌 dirty A たようなI尖があるので送喘 ? Card Table clean B C 512バイトg了に1バイトのバイトテ`ブル C Clean cardは0xFF、dirty cardは0 Card Table C 云栖は症弊旗から仟弊旗を峺すオブジェ クトの了崔をh New Gen. ? putfield/putstatic/aastoreにフック C A.field = Bg佩rになら CardTableModRefBS::byte_map_base [uintptr_t(A) >> CardTableModRefBS::card_shift] = 0 14
  • 15. CMS GCとParNewGCの栽 ? マ`キングI囃 C CMSのマ`キングは喘のビットマップを聞う (CMSBitMap)ので}なし。 ? GC C ConcurrentMarkSweepThreadスレッドが咾い討い誚 嶄にParNewGCが軟きることがある。 その栽はConcurrentMarkSweepThreadが匯r唯峭 してから壅_する。 ParNew GC CMS GC Java threads Parallel GC thr Conc GC thr 15
  • 16. 遺珂皆のフェ`ズ - 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 腎gのサイズ{屁 CMSCollector::compute_new_size 8 Resetting ビットマップのクリアなど CMSCollector::reset 9 Idling CMSWaitDurationミリ昼棋C 3と4のI尖は福待されることがある。 16
  • 17. InitialMarking ? Rootからのマ`クはSTWで佩う。 ? ConcurrentMarkSweepThreadスレッドが峺幣を竃すが、gHのI尖 は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 が鋤峭されていた栽でもo燭淵ブジェクトを // _perm_gen_verify_bit_map BitMap に卞す。 MarkDeadObjectsClosure mdo(this, _permGen->cmsSpace(), markBitMap(), perm_gen_verify_bit_map()); _permGen->cmsSpace()->blk_iterate(&mdo); // Sweep I尖 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