PSParallelCompact クラス内で使用される補助クラス (つまり, Parallel Compaction 処理中で使用される補助クラス).
Mark Sweep Compact 処理の phase 1 処理 (marking 処理) の結果を格納するビットマップ. 格納された情報は phase 3 や phase 4 の処理で使用される (See: here for details).
((cite: hotspot/src/share/vm/gc_implementation/parallelScavenge/parMarkBitMap.hpp))
class ParMarkBitMap: public CHeapObj
{
PSParallelCompact クラスの _mark_bitmap フィールドに(のみ)格納されている.
((cite: hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.hpp))
class PSParallelCompact : AllStatic {
...
static ParMarkBitMap _mark_bitmap;
(PSParallelCompact クラスの _mark_bitmap フィールドは, ポインタ型ではなく実体なので, 初期段階で自動的に生成される)
内部には, 2本の BitMap を保持している.
((cite: hotspot/src/share/vm/gc_implementation/parallelScavenge/parMarkBitMap.hpp))
BitMap _beg_bits;
BitMap _end_bits;
これらの BitMap は, デフォルトでは全部の bit が 0 になっている. marking 処理で live オブジェクトが見つかると, 該当する箇所の bit が 1 に変更される.
(より正確に言うと, 各 live オブジェクトに対して, beg_bits 中のそのオブジェクトの先頭に位置する箇所が 1 になり, _endbits 中のそのオブジェクトの終端に位置する箇所が 1 になる.)
なお, これらの BitMap 中の bit は, メモリ領域中の各 MinObjAlignment バイトの領域に対応する (具体的な MinObjAlignment の大きさについては, set_object_alignment() 参照).
((cite: hotspot/src/share/vm/gc_implementation/parallelScavenge/parMarkBitMap.hpp))
// Each bit in the bitmap represents one unit of 'object granularity.' Objects
// are double-word aligned in 32-bit VMs, but not in 64-bit VMs, so the 32-bit
// granularity is 2, 64-bit is 1.
static inline size_t obj_granularity() { return size_t(MinObjAlignment); }
static inline int obj_granularity_shift() { return LogMinObjAlignment; }
See: here for details
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.