SlideShare a Scribd company logo
1 of 32
並列 GC 第 5 回 JVM ソースコードリーディングの会 (OpenJDK) 中村 実 [email_address] [email_address] Twitter @nminoru_jp
OpenJDK の GC の種類 同上 GenCollectedHeap -Xincgc ( コンカレント GC に -XX:+CMSIncrementalMode をつけたもの ) インクリメンタル GC G1CollectedHeap -XX:+UseG1GC G1GC ParNewGeneration ConcurrentMarkSweep GenCollectedHeap -XX:+UseConcMarkSweepGC コンカレント GC ParallelScavengeHeap -XX:+UseParallelGC 並列 GC ParNewGeneration TenuredGeneration GenCollectedHeap -XX:+UseParNewGC 並列 GC DefNewGeneration TenuredGeneration GenCollectedHeap -XX:+UseSerialGC 逐次 GC 空間のクラス ヒープのクラス オプション
OpenJDK6 の GC の種類 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
逐次 GC の簡単なおさらい ,[object Object],[object Object],[object Object]
逐次 GC の簡単なおさらい ,[object Object],[object Object],[object Object],Perm Old Gen. Eden From To
逐次 GC の簡単なおさらい ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Perm Old Gen. Eden From To
New GC の手順 ,[object Object],[object Object],[object Object],[object Object],c b a
New GC の手順 ,[object Object],[object Object],[object Object],[object Object],c b a b’
New GC の手順 ,[object Object],[object Object],[object Object],[object Object],c b a b’
NewGC のポイント ,[object Object],[object Object],[object Object],オブジェクトの本体 _klass 2 1 4 hash code mark biased lock age
ソースコードで確認 ,[object Object],void DefNewGeneration::collect() { //  ルート (Old 領域を含む ) 内のオブジェクトをスキャンして Eden/From 空間 //  を指すオブジェクトを探す gch->gen_process_strong_roots(_level, // To  空間にコピーさえたオブジェクトをスキャンする evacuate_followers.do_void();
ソースコードで確認 ,[object Object],oop DefNewGeneration::copy_to_survivor_space(oop old) { size_t s = old->size(); oop obj = NULL; // TO  領域から空き容量を確保 obj = (oop) to()->allocate(s); //  コピー Copy::aligned_disjoint_words((HeapWord*)old, (HeapWord*)obj, s); //  古い方を old->forward_to(obj); return obj; }
ソースコードで確認 DefNewGeneration::copy_to_survivor_space  at share/vm/memory/defNewGeneration.cpp:723 FastScanClosure::do_oop_work at share/vm/utilities/globalDefinitions.hpp:418 FastScanClosure::do_oop_nv at share/vm/runtime/thread.hpp:1826 objArrayKlass::oop_oop_iterate_nv at share/vm/oops/objArrayKlass.cpp:439 oopDesc::oop_iterate(FastScanClosure*) at share/vm/utilities/growableArray.hpp:204 ContiguousSpace::oop_since_save_marks_iterate_nv at share/vm/memory/space.cpp:784 OneContigSpaceCardGeneration::oop_since_save_marks_iterate_nv at share/vm/memory/generation.cpp:682 GenCollectedHeap::oop_since_save_marks_iterate at share/vm/memory/genCollectedHeap.cpp:786 DefNewGeneration::FastEvacuateFollowersClosure::do_void at share/vm/memory/defNewGeneration.cpp:112 DefNewGeneration::collect  at share/vm/memory/defNewGeneration.cpp:591 GenCollectedHeap::do_collection at share/vm/memory/genCollectedHeap.cpp:610 GenCollectorPolicy::satisfy_failed_allocation at share/vm/memory/collectorPolicy.cpp:694 GenCollectedHeap::satisfy_failed_allocation at share/vm/memory/genCollectedHeap.cpp:706 VM_GenCollectForAllocation::doit at share/vm/gc_implementation/shared/vmGCOperations.cpp:165 VM_Operation::evaluate at share/vm/runtime/vm_operations.cpp:65 VMThread::evaluate_operation at share/vm/runtime/vmThread.cpp:360 VMThread::loop at share/vm/runtime/vmThread.cpp:466 VMThread::run at share/vm/runtime/vmThread.cpp:273 java_start at os/linux/vm/os_linux.cpp:852 start_thread from /lib/libpthread.so.0 clone from /lib/libc.so.6
逐次 GC の簡単なおさらい ,[object Object],[object Object],[object Object],Perm Old Gen. Eden From To
Full GC の手順 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
ここから並列 GC の話
UseParallelGC ,[object Object],[object Object],[object Object],[object Object],[object Object]
UseParallelGC ,[object Object],// NewGC  の場合 ParallelScavengeHeap::invoke_scavenge PSScavenge::invoke() -> PSScavenge::invoke_no_policy ( 本体 ) // Full GC  の場合 ParallelScavengeHeap::invoke_full_gc if (UseParallelOldGC)  PSParallelCompact::invoke ->  PSParallelCompact::invoke_no_policy ( 本体 ) else PSMarkSweep::invoke
Parallel Scavange ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Parallel Scavange ,[object Object],#0  PSScavenge::invoke_no_policy  at parallelScavenge/psScavenge.cpp:250 #1  PSParallelCompact::invoke  at parallelScavenge/psParallelCompact.cpp:1980 #2  ParallelScavengeHeap::invoke_full_gc  at share/vm/utilities/growableArray.hpp:204 #3  VM_ParallelGCSystemGC::doit  at parallelScavenge/vmPSOperations.cpp:101 #4  VM_Operation::evaluate  at share/vm/runtime/vm_operations.cpp:65 #5  VMThread::evaluate_operation  at share/vm/runtime/vmThread.cpp:360 #6  VMThread::loop  at share/vm/runtime/vmThread.cpp:466 #7  VMThread::run  at /share/vm/runtime/vmThread.cpp:273 #8  java_start  at os/linux/vm/os_linux.cpp:852 #9  start_thread  from /lib/libpthread.so.0 #10  clone  from /lib/libc.so.6
Parallel Scavange ,[object Object],#0  CardTableExtension::scavenge_contents_parallel  at parallelScavenge/cardTableExtension.cpp:227 #1  OldToYoungRootsTask::do_it  at parallelScavenge/psTasks.cpp:224 #2  GCTaskThread::run  at parallelScavenge/gcTaskThread.cpp:135 #3  java_start  at os/linux/vm/os_linux.cpp:852 #4  start_thread  from /lib/libpthread.so.0 #5  clone  from /lib/libc.so.6
Parallel Scavange ,[object Object],#0  PSPromotionManager::copy_to_survivor_space  at parallelScavenge/psPromotionManager.cpp:259 #1  PSScavenge::copy_and_push_safe_barrier  at vm/utilities/growableArray.hpp:204 #2  PSScavengeRootsClosure::do_oop_work   at vm/utilities/growableArray.hpp:204 #3  PSScavengeRootsClosure::do_oop  at vm/utilities/growableArray.hpp:204 #4  Universe::oops_do  at vm/memory/universe.cpp:262 #5  ScavengeRootsTask::do_it  at parallelScavenge/psTasks.cpp:75 #6  GCTaskThread::run  at parallelScavenge/gcTaskThread.cpp:135 #7  java_start  at os/linux/vm/os_linux.cpp:852 #8  start_thread  from /lib/libpthread.so.0 #9  clone  from /lib/libc.so.6
Parallel Scavange oop PSPromotionManager::copy_to_survivor_space(oop o) { oop new_obj = NULL; markOop test_mark = o->mark(); if (!test_mark->is_marked()) { //  このオブジェクトはまだコピーされていない。 // LAB  からコピー先確保 new_obj = (oop) _young_lab.allocate(new_obj_size); // new_obj  が  NULL  なら例外処理 Copy::aligned_disjoint_words((HeapWord*)o, (HeapWord*)new_obj, new_obj_size); // Compare-and-swap  でコピー元オブジェクトに  foward pointer  を設定 if (o->cas_forward_to(new_obj, test_mark)) { new_obj->push_contents(this); }  else { // CAS  に失敗した場合、コピーしたオブジェクトは無駄になった。 // unallocate_object(new_obj)  で  LAB  に返す。 new_obj = o->forwardee(); } } else new_obj = o->forwardee(); //  誰かが既にマークしている場合 return new_obj; }
Parallel Scavange ,[object Object],[object Object],[object Object],- TaskQueueSuper<N> - GenericTaskQueue<E, N> - OverflowTaskQueue<E, N> - OopStarTaskQueue
Parallel Compact ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Parallel Compact ,[object Object],#0  PSScavenge::invoke_no_policy  at parallelScavenge/psScavenge.cpp:250 #1  PSParallelCompact::invoke  at parallelScavenge/psParallelCompact.cpp:1980 #2  ParallelScavengeHeap::invoke_full_gc  at share/vm/utilities/growableArray.hpp:204 #3  VM_ParallelGCSystemGC::doit  at parallelScavenge/vmPSOperations.cpp:101 #4  VM_Operation::evaluate  at share/vm/runtime/vm_operations.cpp:65 #5  VMThread::evaluate_operation  at share/vm/runtime/vmThread.cpp:360 #6  VMThread::loop  at share/vm/runtime/vmThread.cpp:466 #7  VMThread::run  at share/vm/runtime/vmThread.cpp:273 #8  java_start  at os/linux/vm/os_linux.cpp:852 #9  start_thread  from /lib/libpthread.so.0 #10  clone  from /lib/libc.so.6
Parallel Compact ,[object Object],#0  ParMarkBitMap::mark_obj  at parallelScavenge/parMarkBitMap.cpp:92 #1  ParMarkBitMap::mark_obj  at share/vm/memory/cardTableRS.hpp:150 #2  PSParallelCompact::mark_obj  at share/vm/memory/cardTableRS.hpp:150 #3  PSParallelCompact::mark_and_push  at share/vm/memory/cardTableRS.hpp:150 #4  PSParallelCompact::MarkAndPushClosure::do_oop  at parallelScavenge/psParallelCompact.cpp:822 #5  JNIHandles::oops_do  at share/vm/runtime/jniHandles.cpp:146 #6  MarkFromRootsTask::do_it  at parallelScavenge/pcTasks.cpp:88 #7  GCTaskThread::run  at parallelScavenge/gcTaskThread.cpp:135 #8  java_start  at os/linux/vm/os_linux.cpp:852 #9  start_thread  from /lib/libpthread.so.0 #10  clone  from /lib/libc.so.6
Parallel Compact ,[object Object],#0  ParMarkBitMap::mark_obj  at parallelScavenge/parMarkBitMap.cpp:92 #1  ParMarkBitMap::mark_obj  at share/vm/memory/cardTableRS.hpp:150 #2  PSParallelCompact::mark_obj  at share/vm/memory/cardTableRS.hpp:150 #3  PSParallelCompact::mark_and_push  at share/vm/memory/cardTableRS.hpp:150 #4  PSParallelCompact::MarkAndPushClosure::do_oop  at parallelScavenge/psParallelCompact.cpp:822 #5  JNIHandles::oops_do  at share/vm/runtime/jniHandles.cpp:146 #6  MarkFromRootsTask::do_it  at parallelScavenge/pcTasks.cpp:88 #7  GCTaskThread::run  at parallelScavenge/gcTaskThread.cpp:135 #8  java_start  at os/linux/vm/os_linux.cpp:852 #9  start_thread  from /lib/libpthread.so.0 #10  clone  from /lib/libc.so.6
Parallel Compact ,[object Object],[object Object],#0  PSParallelCompact::adjust_pointer  at  parallelScavenge/psParallelCompact.hpp:1318 #1  PSParallelCompact::AdjustPointerClosure::do_oop  at parallelScavenge/psParallelCompact.cpp:817 #2  Universe::oops_do  at share/vm/memory/universe.cpp:208 #3  PSParallelCompact::adjust_roots  at parallelScavenge/psParallelCompact.cpp:2449 #4  PSParallelCompact::invoke_no_policy  at parallelScavenge/psParallelCompact.cpp:2098 #5  PSParallelCompact::invoke  at parallelScavenge/psParallelCompact.cpp:1987 #6  ParallelScavengeHeap::invoke_full_gc  at share/vm/utilities/growableArray.hpp:204 #7  VM_ParallelGCSystemGC::doit  at parallelScavenge/vmPSOperations.cpp:101 ...
Parallel Compact ,[object Object],template <class T> inline void PSParallelCompact::adjust_pointer(T* p, bool isroot) { T heap_oop = oopDesc::load_heap_oop(p); if (!oopDesc::is_null(heap_oop)) { oop obj  = oopDesc::decode_heap_oop_not_null(heap_oop); oop new_obj =  (oop)summary_data().calc_new_pointer(obj);  //  移動先の取得 // Just always do the update unconditionally? if (new_obj != NULL) { oopDesc::encode_store_heap_oop_not_null(p, new_obj); //  ポインタ変更 }  } }
Parallel Compact ,[object Object],#0  PSParallelCompact::adjust_pointer  at  parallelScavenge/psParallelCompact.hpp:1318 #1  PSParallelCompact::adjust_pointer at share/vm/memory/cardTableRS.hpp:150 #2  klassKlass::oop_update_pointers at share/vm/oops/klassKlass.cpp:193 #3  oopDesc::update_contents at share/vm/utilities/growableArray.hpp:204 #4  UpdateOnlyClosure::do_addr at  parallelScavenge/psParallelCompact.hpp:1498 #5  UpdateOnlyClosure::do_addr at parallelScavenge/psParallelCompact.cpp:3514 #6  ParMarkBitMap::iterate at parallelScavenge/parMarkBitMap.cpp:219 #7  ParMarkBitMap::iterate at share/vm/utilities/growableArray.hpp:204 #8  PSParallelCompact::update_and_deadwood_in_dense_prefix at parallelScavenge/psParallelCompact.cpp:3001 #9  PSParallelCompact::move_and_update  at parallelScavenge/psParallelCompact.cpp:3404 #10 PSParallelCompact::compact_perm at sparallelScavenge/psParallelCompact.cpp:2484 #11 PSParallelCompact::invoke_no_policy at parallelScavenge/psParallelCompact.cpp:2103
Parallel Compact ,[object Object],#0  PSParallelCompact::adjust_pointer  at share/vm/memory/cardTableRS.hpp:150 #1  PSParallelCompact::adjust_pointer  at share/vm/memory/cardTableRS.hpp:150 #2  instanceKlass::oop_update_pointers  at share/vm/oops/instanceKlass.cpp:1870 #3  oopDesc::update_contents  at share/vm/utilities/growableArray.hpp:204 #4  MoveAndUpdateClosure::do_addr  at parallelScavenge/psParallelCompact.cpp:3494 #5  ParMarkBitMap::iterate  at parallelScavenge/parMarkBitMap.cpp:171 #6  ParMarkBitMap::iterate  at share/vm/utilities/growableArray.hpp:204 #7  PSParallelCompact::fill_region  at parallelScavenge/psParallelCompact.cpp:3323 #8  PSParallelCompact::fill_and_update_region  at share/vm/utilities/growableArray.hpp:204 #9  ParCompactionManager::drain_region_stacks  at parallelScavenge/psCompactionManager.cpp:172 #10  DrainStacksCompactionTask::do_it  at parallelScavenge/pcTasks.cpp:297 #11  GCTaskThread::run  at parallelScavenge/gcTaskThread.cpp:135 ...

More Related Content

What's hot

BoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうかBoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうかYuki Miyatake
 
関ジャバ JavaOne Tokyo 2012報告会
関ジャバ JavaOne Tokyo 2012報告会関ジャバ JavaOne Tokyo 2012報告会
関ジャバ JavaOne Tokyo 2012報告会Koichi Sakata
 
Async design with Unity3D
Async design with Unity3DAsync design with Unity3D
Async design with Unity3DKouji Hosoda
 
Effective Modern C++ 読書会 Item 35
Effective Modern C++ 読書会 Item 35Effective Modern C++ 読書会 Item 35
Effective Modern C++ 読書会 Item 35Keisuke Fukuda
 
Effective Modern C++ 勉強会#3 Item16
Effective Modern C++ 勉強会#3 Item16Effective Modern C++ 勉強会#3 Item16
Effective Modern C++ 勉強会#3 Item16Mitsuru Kariya
 
Javaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組みJavaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組みChihiro Ito
 
async/await のしくみ
async/await のしくみasync/await のしくみ
async/await のしくみ信之 岩永
 
Effective Modern C++ 勉強会#3 Item 15
Effective Modern C++ 勉強会#3 Item 15Effective Modern C++ 勉強会#3 Item 15
Effective Modern C++ 勉強会#3 Item 15Mitsuru Kariya
 
デバドラを書いてみよう!
デバドラを書いてみよう!デバドラを書いてみよう!
デバドラを書いてみよう!Masami Ichikawa
 
Lisp Tutorial for Pythonista : Day 4
Lisp Tutorial for Pythonista : Day 4Lisp Tutorial for Pythonista : Day 4
Lisp Tutorial for Pythonista : Day 4Ransui Iso
 
きつねさんでもわかるLlvm読書会 第2回
きつねさんでもわかるLlvm読書会 第2回きつねさんでもわかるLlvm読書会 第2回
きつねさんでもわかるLlvm読書会 第2回Tomoya Kawanishi
 
関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPUTakuro Iizuka
 
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_cccJEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_cccYujiSoftware
 
Google Perf Tools (tcmalloc) の使い方
Google Perf Tools (tcmalloc) の使い方Google Perf Tools (tcmalloc) の使い方
Google Perf Tools (tcmalloc) の使い方Kazuki Ohta
 
非同期処理の基礎
非同期処理の基礎非同期処理の基礎
非同期処理の基礎信之 岩永
 

What's hot (20)

BoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうかBoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうか
 
関ジャバ JavaOne Tokyo 2012報告会
関ジャバ JavaOne Tokyo 2012報告会関ジャバ JavaOne Tokyo 2012報告会
関ジャバ JavaOne Tokyo 2012報告会
 
Async design with Unity3D
Async design with Unity3DAsync design with Unity3D
Async design with Unity3D
 
Effective Modern C++ 読書会 Item 35
Effective Modern C++ 読書会 Item 35Effective Modern C++ 読書会 Item 35
Effective Modern C++ 読書会 Item 35
 
Effective Modern C++ 勉強会#3 Item16
Effective Modern C++ 勉強会#3 Item16Effective Modern C++ 勉強会#3 Item16
Effective Modern C++ 勉強会#3 Item16
 
Effective modern-c++#9
Effective modern-c++#9Effective modern-c++#9
Effective modern-c++#9
 
Javaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組みJavaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組み
 
Slub data structure
Slub data structureSlub data structure
Slub data structure
 
C++ マルチスレッド 入門
C++ マルチスレッド 入門C++ マルチスレッド 入門
C++ マルチスレッド 入門
 
async/await のしくみ
async/await のしくみasync/await のしくみ
async/await のしくみ
 
Effective Modern C++ 勉強会#3 Item 15
Effective Modern C++ 勉強会#3 Item 15Effective Modern C++ 勉強会#3 Item 15
Effective Modern C++ 勉強会#3 Item 15
 
デバドラを書いてみよう!
デバドラを書いてみよう!デバドラを書いてみよう!
デバドラを書いてみよう!
 
Lisp Tutorial for Pythonista : Day 4
Lisp Tutorial for Pythonista : Day 4Lisp Tutorial for Pythonista : Day 4
Lisp Tutorial for Pythonista : Day 4
 
きつねさんでもわかるLlvm読書会 第2回
きつねさんでもわかるLlvm読書会 第2回きつねさんでもわかるLlvm読書会 第2回
きつねさんでもわかるLlvm読書会 第2回
 
関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU
 
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_cccJEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
 
講座Java入門
講座Java入門講座Java入門
講座Java入門
 
Google Perf Tools (tcmalloc) の使い方
Google Perf Tools (tcmalloc) の使い方Google Perf Tools (tcmalloc) の使い方
Google Perf Tools (tcmalloc) の使い方
 
非同期処理の基礎
非同期処理の基礎非同期処理の基礎
非同期処理の基礎
 
C++14 Overview
C++14 OverviewC++14 Overview
C++14 Overview
 

Viewers also liked

UseNUMA做了什么?(2012-03-14)
UseNUMA做了什么?(2012-03-14)UseNUMA做了什么?(2012-03-14)
UseNUMA做了什么?(2012-03-14)Kris Mok
 
x86-64/Linuxに独自メモリ空間を勝手増設
x86-64/Linuxに独自メモリ空間を勝手増設x86-64/Linuxに独自メモリ空間を勝手増設
x86-64/Linuxに独自メモリ空間を勝手増設Minoru Nakamura
 
为啥别读HotSpot VM的源码(2012-03-03)
为啥别读HotSpot VM的源码(2012-03-03)为啥别读HotSpot VM的源码(2012-03-03)
为啥别读HotSpot VM的源码(2012-03-03)Kris Mok
 
0円でできる自宅InfiniBandプログラム
0円でできる自宅InfiniBandプログラム0円でできる自宅InfiniBandプログラム
0円でできる自宅InfiniBandプログラムMinoru Nakamura
 
Nashorn on JDK 8 (ADC2013)
Nashorn on JDK 8 (ADC2013)Nashorn on JDK 8 (ADC2013)
Nashorn on JDK 8 (ADC2013)Kris Mok
 
Persistent-Memory-Programming-Model
Persistent-Memory-Programming-ModelPersistent-Memory-Programming-Model
Persistent-Memory-Programming-ModelMinoru Nakamura
 
プログラマ目線から見たRDMAのメリットと その応用例について
プログラマ目線から見たRDMAのメリットとその応用例についてプログラマ目線から見たRDMAのメリットとその応用例について
プログラマ目線から見たRDMAのメリットと その応用例についてMasanori Itoh
 
低遅延Ethernetとファブリックによるデータセンタ・ネットワーク
低遅延Ethernetとファブリックによるデータセンタ・ネットワーク低遅延Ethernetとファブリックによるデータセンタ・ネットワーク
低遅延Ethernetとファブリックによるデータセンタ・ネットワークNaoto MATSUMOTO
 
シーサーでのInfiniBand導入事例
シーサーでのInfiniBand導入事例シーサーでのInfiniBand導入事例
シーサーでのInfiniBand導入事例Naoto MATSUMOTO
 
Intrinsic Methods in HotSpot VM
Intrinsic Methods in HotSpot VMIntrinsic Methods in HotSpot VM
Intrinsic Methods in HotSpot VMKris Mok
 
ioDriceとInfiniBandとDRBDを利用したリアルタイムレプリケーション
ioDriceとInfiniBandとDRBDを利用したリアルタイムレプリケーションioDriceとInfiniBandとDRBDを利用したリアルタイムレプリケーション
ioDriceとInfiniBandとDRBDを利用したリアルタイムレプリケーションIwasaki Noboru
 
InfiniBand Presentation
InfiniBand PresentationInfiniBand Presentation
InfiniBand PresentationShekhar Kumar
 
x86-64/Linuxに独自メモリ空間を勝手増設
x86-64/Linuxに独自メモリ空間を勝手増設x86-64/Linuxに独自メモリ空間を勝手増設
x86-64/Linuxに独自メモリ空間を勝手増設Minoru Nakamura
 
JVM @ Taobao - QCon Hangzhou 2011
JVM @ Taobao - QCon Hangzhou 2011JVM @ Taobao - QCon Hangzhou 2011
JVM @ Taobao - QCon Hangzhou 2011Kris Mok
 
Implementing a JavaScript Engine
Implementing a JavaScript EngineImplementing a JavaScript Engine
Implementing a JavaScript EngineKris Mok
 
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
 

Viewers also liked (20)

UseNUMA做了什么?(2012-03-14)
UseNUMA做了什么?(2012-03-14)UseNUMA做了什么?(2012-03-14)
UseNUMA做了什么?(2012-03-14)
 
x86-64/Linuxに独自メモリ空間を勝手増設
x86-64/Linuxに独自メモリ空間を勝手増設x86-64/Linuxに独自メモリ空間を勝手増設
x86-64/Linuxに独自メモリ空間を勝手増設
 
为啥别读HotSpot VM的源码(2012-03-03)
为啥别读HotSpot VM的源码(2012-03-03)为啥别读HotSpot VM的源码(2012-03-03)
为啥别读HotSpot VM的源码(2012-03-03)
 
Dentoo.LT12 並列処理・MPIの第一歩 20151025
Dentoo.LT12 並列処理・MPIの第一歩 20151025Dentoo.LT12 並列処理・MPIの第一歩 20151025
Dentoo.LT12 並列処理・MPIの第一歩 20151025
 
0円でできる自宅InfiniBandプログラム
0円でできる自宅InfiniBandプログラム0円でできる自宅InfiniBandプログラム
0円でできる自宅InfiniBandプログラム
 
SC16 NVIDIA NEWS
SC16 NVIDIA NEWSSC16 NVIDIA NEWS
SC16 NVIDIA NEWS
 
Jvm reading-parallel gc
Jvm reading-parallel gcJvm reading-parallel gc
Jvm reading-parallel gc
 
Nashorn on JDK 8 (ADC2013)
Nashorn on JDK 8 (ADC2013)Nashorn on JDK 8 (ADC2013)
Nashorn on JDK 8 (ADC2013)
 
Persistent-Memory-Programming-Model
Persistent-Memory-Programming-ModelPersistent-Memory-Programming-Model
Persistent-Memory-Programming-Model
 
プログラマ目線から見たRDMAのメリットと その応用例について
プログラマ目線から見たRDMAのメリットとその応用例についてプログラマ目線から見たRDMAのメリットとその応用例について
プログラマ目線から見たRDMAのメリットと その応用例について
 
低遅延Ethernetとファブリックによるデータセンタ・ネットワーク
低遅延Ethernetとファブリックによるデータセンタ・ネットワーク低遅延Ethernetとファブリックによるデータセンタ・ネットワーク
低遅延Ethernetとファブリックによるデータセンタ・ネットワーク
 
シーサーでのInfiniBand導入事例
シーサーでのInfiniBand導入事例シーサーでのInfiniBand導入事例
シーサーでのInfiniBand導入事例
 
MPIによる並列計算
MPIによる並列計算MPIによる並列計算
MPIによる並列計算
 
Intrinsic Methods in HotSpot VM
Intrinsic Methods in HotSpot VMIntrinsic Methods in HotSpot VM
Intrinsic Methods in HotSpot VM
 
ioDriceとInfiniBandとDRBDを利用したリアルタイムレプリケーション
ioDriceとInfiniBandとDRBDを利用したリアルタイムレプリケーションioDriceとInfiniBandとDRBDを利用したリアルタイムレプリケーション
ioDriceとInfiniBandとDRBDを利用したリアルタイムレプリケーション
 
InfiniBand Presentation
InfiniBand PresentationInfiniBand Presentation
InfiniBand Presentation
 
x86-64/Linuxに独自メモリ空間を勝手増設
x86-64/Linuxに独自メモリ空間を勝手増設x86-64/Linuxに独自メモリ空間を勝手増設
x86-64/Linuxに独自メモリ空間を勝手増設
 
JVM @ Taobao - QCon Hangzhou 2011
JVM @ Taobao - QCon Hangzhou 2011JVM @ Taobao - QCon Hangzhou 2011
JVM @ Taobao - QCon Hangzhou 2011
 
Implementing a JavaScript Engine
Implementing a JavaScript EngineImplementing a JavaScript Engine
Implementing a JavaScript Engine
 
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
 

Similar to JVM-Reading-ParalleGC

TypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめTypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめYu Nobuoka
 
Javaで簡単にgpgpu aparapi
Javaで簡単にgpgpu aparapiJavaで簡単にgpgpu aparapi
Javaで簡単にgpgpu aparapiKen'ichi Sakiyama
 
Grails-1.1を斬る!~Grails-1.1からのチーム開発~ in Tokyo
Grails-1.1を斬る!~Grails-1.1からのチーム開発~ in TokyoGrails-1.1を斬る!~Grails-1.1からのチーム開発~ in Tokyo
Grails-1.1を斬る!~Grails-1.1からのチーム開発~ in TokyoTsuyoshi Yamamoto
 
Rのデータ構造とメモリ管理
Rのデータ構造とメモリ管理Rのデータ構造とメモリ管理
Rのデータ構造とメモリ管理Takeshi Arabiki
 
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8y_taka_23
 
メディア・アートII 第3回 openFrameworks基礎 OOoF : オブジェクト指向 oF
メディア・アートII 第3回 openFrameworks基礎 OOoF : オブジェクト指向 oFメディア・アートII 第3回 openFrameworks基礎 OOoF : オブジェクト指向 oF
メディア・アートII 第3回 openFrameworks基礎 OOoF : オブジェクト指向 oFAtsushi Tadokoro
 
Java SE 7 InvokeDynamic in JRuby
Java SE 7 InvokeDynamic in JRubyJava SE 7 InvokeDynamic in JRuby
Java SE 7 InvokeDynamic in JRubyHiroshi Nakamura
 
Miyazaki.js vol.1 スコープの話
Miyazaki.js vol.1 スコープの話Miyazaki.js vol.1 スコープの話
Miyazaki.js vol.1 スコープの話Nobuhiro Nakashima
 
tokyo.vcl発表資料(VarnishCache3.0新機能とVUPの仕方)
tokyo.vcl発表資料(VarnishCache3.0新機能とVUPの仕方)tokyo.vcl発表資料(VarnishCache3.0新機能とVUPの仕方)
tokyo.vcl発表資料(VarnishCache3.0新機能とVUPの仕方)Iwana Chan
 
サイ本読書会4章変数
サイ本読書会4章変数サイ本読書会4章変数
サイ本読書会4章変数ztyper
 
x86とコンテキストスイッチ
x86とコンテキストスイッチx86とコンテキストスイッチ
x86とコンテキストスイッチMasami Ichikawa
 
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
 
GCをみればRTSが見えてくる、かも。。。
GCをみればRTSが見えてくる、かも。。。GCをみればRTSが見えてくる、かも。。。
GCをみればRTSが見えてくる、かも。。。dec9ue
 
Java オブジェクトの内部構造
Java オブジェクトの内部構造Java オブジェクトの内部構造
Java オブジェクトの内部構造Taku Miyakawa
 
GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法博文 斉藤
 

Similar to JVM-Reading-ParalleGC (20)

MoteMote Compiler Plugin
MoteMote Compiler PluginMoteMote Compiler Plugin
MoteMote Compiler Plugin
 
TypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめTypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめ
 
Javaで簡単にgpgpu aparapi
Javaで簡単にgpgpu aparapiJavaで簡単にgpgpu aparapi
Javaで簡単にgpgpu aparapi
 
Grails-1.1を斬る!~Grails-1.1からのチーム開発~ in Tokyo
Grails-1.1を斬る!~Grails-1.1からのチーム開発~ in TokyoGrails-1.1を斬る!~Grails-1.1からのチーム開発~ in Tokyo
Grails-1.1を斬る!~Grails-1.1からのチーム開発~ in Tokyo
 
Rのデータ構造とメモリ管理
Rのデータ構造とメモリ管理Rのデータ構造とメモリ管理
Rのデータ構造とメモリ管理
 
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
 
メディア・アートII 第3回 openFrameworks基礎 OOoF : オブジェクト指向 oF
メディア・アートII 第3回 openFrameworks基礎 OOoF : オブジェクト指向 oFメディア・アートII 第3回 openFrameworks基礎 OOoF : オブジェクト指向 oF
メディア・アートII 第3回 openFrameworks基礎 OOoF : オブジェクト指向 oF
 
Java SE 7 InvokeDynamic in JRuby
Java SE 7 InvokeDynamic in JRubyJava SE 7 InvokeDynamic in JRuby
Java SE 7 InvokeDynamic in JRuby
 
Miyazaki.js vol.1 スコープの話
Miyazaki.js vol.1 スコープの話Miyazaki.js vol.1 スコープの話
Miyazaki.js vol.1 スコープの話
 
tokyo.vcl発表資料(VarnishCache3.0新機能とVUPの仕方)
tokyo.vcl発表資料(VarnishCache3.0新機能とVUPの仕方)tokyo.vcl発表資料(VarnishCache3.0新機能とVUPの仕方)
tokyo.vcl発表資料(VarnishCache3.0新機能とVUPの仕方)
 
Slub alloc and free
Slub alloc and freeSlub alloc and free
Slub alloc and free
 
サイ本読書会4章変数
サイ本読書会4章変数サイ本読書会4章変数
サイ本読書会4章変数
 
x86とコンテキストスイッチ
x86とコンテキストスイッチx86とコンテキストスイッチ
x86とコンテキストスイッチ
 
Phantom Type in Scala
Phantom Type in ScalaPhantom Type in Scala
Phantom Type in Scala
 
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
 
0x300
0x3000x300
0x300
 
GCをみればRTSが見えてくる、かも。。。
GCをみればRTSが見えてくる、かも。。。GCをみればRTSが見えてくる、かも。。。
GCをみればRTSが見えてくる、かも。。。
 
20130819 jjugnslt
20130819 jjugnslt20130819 jjugnslt
20130819 jjugnslt
 
Java オブジェクトの内部構造
Java オブジェクトの内部構造Java オブジェクトの内部構造
Java オブジェクトの内部構造
 
GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法
 

JVM-Reading-ParalleGC

  • 1. 並列 GC 第 5 回 JVM ソースコードリーディングの会 (OpenJDK) 中村 実 [email_address] [email_address] Twitter @nminoru_jp
  • 2. OpenJDK の GC の種類 同上 GenCollectedHeap -Xincgc ( コンカレント GC に -XX:+CMSIncrementalMode をつけたもの ) インクリメンタル GC G1CollectedHeap -XX:+UseG1GC G1GC ParNewGeneration ConcurrentMarkSweep GenCollectedHeap -XX:+UseConcMarkSweepGC コンカレント GC ParallelScavengeHeap -XX:+UseParallelGC 並列 GC ParNewGeneration TenuredGeneration GenCollectedHeap -XX:+UseParNewGC 並列 GC DefNewGeneration TenuredGeneration GenCollectedHeap -XX:+UseSerialGC 逐次 GC 空間のクラス ヒープのクラス オプション
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13. ソースコードで確認 DefNewGeneration::copy_to_survivor_space at share/vm/memory/defNewGeneration.cpp:723 FastScanClosure::do_oop_work at share/vm/utilities/globalDefinitions.hpp:418 FastScanClosure::do_oop_nv at share/vm/runtime/thread.hpp:1826 objArrayKlass::oop_oop_iterate_nv at share/vm/oops/objArrayKlass.cpp:439 oopDesc::oop_iterate(FastScanClosure*) at share/vm/utilities/growableArray.hpp:204 ContiguousSpace::oop_since_save_marks_iterate_nv at share/vm/memory/space.cpp:784 OneContigSpaceCardGeneration::oop_since_save_marks_iterate_nv at share/vm/memory/generation.cpp:682 GenCollectedHeap::oop_since_save_marks_iterate at share/vm/memory/genCollectedHeap.cpp:786 DefNewGeneration::FastEvacuateFollowersClosure::do_void at share/vm/memory/defNewGeneration.cpp:112 DefNewGeneration::collect at share/vm/memory/defNewGeneration.cpp:591 GenCollectedHeap::do_collection at share/vm/memory/genCollectedHeap.cpp:610 GenCollectorPolicy::satisfy_failed_allocation at share/vm/memory/collectorPolicy.cpp:694 GenCollectedHeap::satisfy_failed_allocation at share/vm/memory/genCollectedHeap.cpp:706 VM_GenCollectForAllocation::doit at share/vm/gc_implementation/shared/vmGCOperations.cpp:165 VM_Operation::evaluate at share/vm/runtime/vm_operations.cpp:65 VMThread::evaluate_operation at share/vm/runtime/vmThread.cpp:360 VMThread::loop at share/vm/runtime/vmThread.cpp:466 VMThread::run at share/vm/runtime/vmThread.cpp:273 java_start at os/linux/vm/os_linux.cpp:852 start_thread from /lib/libpthread.so.0 clone from /lib/libc.so.6
  • 14.
  • 15.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23. Parallel Scavange oop PSPromotionManager::copy_to_survivor_space(oop o) { oop new_obj = NULL; markOop test_mark = o->mark(); if (!test_mark->is_marked()) { // このオブジェクトはまだコピーされていない。 // LAB からコピー先確保 new_obj = (oop) _young_lab.allocate(new_obj_size); // new_obj が NULL なら例外処理 Copy::aligned_disjoint_words((HeapWord*)o, (HeapWord*)new_obj, new_obj_size); // Compare-and-swap でコピー元オブジェクトに foward pointer を設定 if (o->cas_forward_to(new_obj, test_mark)) { new_obj->push_contents(this); } else { // CAS に失敗した場合、コピーしたオブジェクトは無駄になった。 // unallocate_object(new_obj) で LAB に返す。 new_obj = o->forwardee(); } } else new_obj = o->forwardee(); // 誰かが既にマークしている場合 return new_obj; }
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.