An introduction into the Garbage First (G1) garbage collector for the JVM. The session covers general GC concepts, the fundamentals of G1 and how to setup and tune the JVM for G1.
The document discusses tuning Java for large data workloads. It covers symptoms of memory issues like jobs getting stuck or failing. It then discusses various Java and Hadoop configuration settings to optimize memory usage like mapreduce.child.java.opts and mapreduce.map.memory.mb. Finally, it provides an overview of different garbage collectors in Java and factors like generation sizes and concurrent marking that impact performance.
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
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
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
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