これらは, メモリ管理用のクラス. より具体的に言うと, Java ヒープ用のメモリ領域を管理するためのクラス (See: here for details).
Java ヒープ用のメモリ領域を管理するクラスは使用する GC アルゴリズムによって異なるが, これらのクラスは GC アルゴリズムが ParallelScavenge 以外の場合に使用される (つまり, G1CollectedHeap および GenCollectedHeap 用) (See: ImmutableSpace, MutableSpace).
(<= なお, 正確には G1CollectedHeap もここで定義されているクラスをそのまま使っているわけではなく, 独自に作ったサブクラスを使用している (See: HeapRegion))
(<= なので, ここで定義されているクラスを直接的に使っているのは GenCollectedHeap だけ)
((cite: hotspot/src/share/vm/memory/space.hpp))
// A space is an abstraction for the "storage units" backing
// up the generation abstraction. It includes specific
// implementations for keeping track of free and used space,
// for iterating over objects and free blocks, etc.
なお, これらのクラスは以下のような継承関係を持つ.
((cite: hotspot/src/share/vm/memory/space.hpp))
// Here's the Space hierarchy:
//
// - Space -- an asbtract base class describing a heap area
// - CompactibleSpace -- a space supporting compaction
// - CompactibleFreeListSpace -- (used for CMS generation)
// - ContiguousSpace -- a compactible space in which all free space
// is contiguous
// - EdenSpace -- contiguous space used as nursery
// - ConcEdenSpace -- contiguous space with a 'soft end safe' allocation
// - OffsetTableContigSpace -- contiguous space with a block offset array
// that allows "fast" block_start calls
// - TenuredSpace -- (used for TenuredGeneration)
// - ContigPermSpace -- an offset table contiguous space for perm gen
Java ヒープ用のメモリ領域を管理するためのクラス (の基底クラス) (See: here for details).
Java ヒープ用のメモリ領域を管理するクラスは使用する GC アルゴリズムによって異なるが, このクラスは GC アルゴリズムが ParallelScavenge 以外の場合に使用される (つまり, G1CollectedHeap および GenCollectedHeap 用) (See: ImmutableSpace).
以下のような機能を提供する.
なお, このクラス自体は abstract class であり, 実際に使われるのはサブクラス.
なお, このクラスにおいては以下のような不変条件がある. (とコメントには書いてあるが, top は ContiguousSpace のサブクラスでないと存在しないような... なお, bottom は領域の下端, top は使用済みの範囲の終端, end は領域の上端, を指す)
bottom() <= top() <= end()
" という不等式が成り立つ ((cite: hotspot/src/share/vm/memory/space.hpp))
// A Space describes a heap area. Class Space is an abstract
// base class.
//
// Space supports allocation, size computation and GC support is provided.
//
// Invariant: bottom() and end() are on page_size boundaries and
// bottom() <= top() <= end()
// top() is inclusive and end() is exclusive.
class Space: public CHeapObj {
内部には以下のようなフィールドを含む.
_bottom は領域の下端のアドレスを, _end は領域の上端のアドレスを格納する.
((cite: hotspot/src/share/vm/memory/space.hpp))
HeapWord* _bottom;
HeapWord* _end;
See: here for details
GC によるコンパクション処理をサポートした Space クラス (の基底クラス) (See: here for details).
コメントによると, 大抵は連続領域になるがそうである必要性はなく, 例えば通常時はフリーリスト管理で Full GC 時のみコンパクションを行うという実装も考えられる, とのこと.
なお, このクラス自体は abstract class であり, 実際に使われるのはサブクラス.
((cite: hotspot/src/share/vm/memory/space.hpp))
// A space that supports compaction operations. This is usually, but not
// necessarily, a space that is normally contiguous. But, for example, a
// free-list-based space whose normal collection is a mark-sweep without
// compaction could still support compaction in full GC's.
class CompactibleSpace: public Space {
(スーパークラスである Space クラスのメソッドに加えて) 以下のようなコンパクション処理を補佐するメソッドが定義されている.
((cite: hotspot/src/share/vm/memory/space.hpp))
// MarkSweep support phase2
// Start the process of compaction of the current space: compute
// post-compaction addresses, and insert forwarding pointers. The fields
// "cp->gen" and "cp->compaction_space" are the generation and space into
// which we are currently compacting. This call updates "cp" as necessary,
// and leaves the "compaction_top" of the final value of
// "cp->compaction_space" up-to-date. Offset tables may be updated in
// this phase as if the final copy had occurred; if so, "cp->threshold"
// indicates when the next such action should be taken.
virtual void prepare_for_compaction(CompactPoint* cp);
// MarkSweep support phase3
virtual void adjust_pointers();
// MarkSweep support phase4
virtual void compact();
See: here for details
CompactibleSpace クラスの具象サブクラスの1つ.
このクラスは, 空き領域が連続領域になるように管理する場合用. 連続領域にすることで高速なメモリ確保操作やコンパクション操作が実現できている
(なお, 不連続に管理する場合の具象サブクラスは CompactibleFreeListSpace).
((cite: hotspot/src/share/vm/memory/space.hpp))
// A space in which the free area is contiguous. It therefore supports
// faster allocation, and compaction.
class ContiguousSpace: public CompactibleSpace {
以下の箇所に(のみ)格納されている.
(DefNewGeneration 使用時の From 領域を表す)
(DefNewGeneration 使用時の To 領域を表す)
((cite: hotspot/src/share/vm/memory/defNewGeneration.cpp))
DefNewGeneration::DefNewGeneration(ReservedSpace rs,
size_t initial_size,
int level,
const char* policy)
...
{
...
_from_space = new ContiguousSpace();
_to_space = new ContiguousSpace();
DefNewGeneration::DefNewGeneration() 内で(のみ)生成されている.
内部では, 現在使用済みの範囲の終端を _top フィールドが指している
(_bottom から _top までが使用済みの範囲, _top から _end までが未使用の範囲).
((cite: hotspot/src/share/vm/memory/space.hpp))
HeapWord* _top;
このクラスは G1CollectedHeap および GenCollectedHeap 用のクラスだが (See: Space), ParallelScavengeHeap 使用時についても類似した MutableSpace というクラスが使用されている (See: MutableSpace).
See: here for details
DefNewGeneration クラス用の補助クラス (See: DefNewGeneration).
DefNewGeneration 使用時の Eden 領域を表すためのクラスの 1つ. このクラスは, GC アルゴリズムが CMS (incremental mode) ではない場合用 (See: ConcEdenSpace).
(<= もう少し正確に言うと, "DefNewGeneration 使用時 && (CMS 非使用時 || CMSIncrementalMode オプション非指定時)", ためのクラス. つまり "Serial GC && Serial Old GC 時" か "Serial GC && CMS GC (非 incremental mode) 時" のためのクラス)
((cite: hotspot/src/share/vm/memory/space.hpp))
// Class EdenSpace describes eden-space in new generation.
...
class EdenSpace : public ContiguousSpace {
各 DefNewGeneration オブジェクトの _eden_space フィールドに(のみ)格納されている.
DefNewGeneration::DefNewGeneration() 内で(のみ)生成されている.
(なお EdenSpace が生成されるかどうかは, GC アルゴリズム及び CMSIncrementalMode オプションの値によって決まる. GC アルゴリズムが CMS でかつ CMSIncrementalMode オプションが true の場合には (CollectorPolicy::has_soft_ended_eden() が true を返すため) ConcEdenSpace が生成される. そうでない場合には EdenSpace が生成される)
((cite: hotspot/src/share/vm/memory/defNewGeneration.cpp))
DefNewGeneration::DefNewGeneration(ReservedSpace rs,
size_t initial_size,
int level,
const char* policy)
...
{
...
if (GenCollectedHeap::heap()->collector_policy()->has_soft_ended_eden()) {
_eden_space = new ConcEdenSpace(this);
} else {
_eden_space = new EdenSpace(this);
}
See: here for details
See: here for details
See: here for details
DefNewGeneration クラス用の補助クラス (See: DefNewGeneration).
DefNewGeneration 使用時の Eden 領域を表すためのクラスの 1つ. このクラスは, GC アルゴリズムが CMS (incremental mode) の場合用 (See: EdenSpace).
(<= もう少し正確に言うと, "DefNewGeneration 使用時 && CMS 使用時 && CMSIncrementalMode オプション指定時", ためのクラス. つまり "Serial GC && CMS (incremental mode) 時" のためのクラス)
((cite: hotspot/src/share/vm/memory/space.hpp))
// Class ConcEdenSpace extends EdenSpace for the sake of safe
// allocation while soft-end is being modified concurrently
class ConcEdenSpace : public EdenSpace {
各 DefNewGeneration オブジェクトの _eden_space フィールドに(のみ)格納されている.
DefNewGeneration::DefNewGeneration() 内で(のみ)生成されている.
(なお EdenSpace が生成されるかどうかは, GC アルゴリズム及び CMSIncrementalMode オプションの値によって決まる. GC アルゴリズムが CMS でかつ CMSIncrementalMode オプションが true の場合には (CollectorPolicy::has_soft_ended_eden() が true を返すため) ConcEdenSpace が生成される. そうでない場合には EdenSpace が生成される)
((cite: hotspot/src/share/vm/memory/defNewGeneration.cpp))
DefNewGeneration::DefNewGeneration(ReservedSpace rs,
size_t initial_size,
int level,
const char* policy)
...
{
...
if (GenCollectedHeap::heap()->collector_policy()->has_soft_ended_eden()) {
_eden_space = new ConcEdenSpace(this);
} else {
_eden_space = new EdenSpace(this);
}
See: here for details
See: here for details
CMSIncrementalMode オプションは "-Xincgc" というオプション名でも指定可能 (-Xincgc は CMSIncrementalMode のエイリアス).
((cite: hotspot/src/share/vm/runtime/arguments.cpp))
// -Xincgc: i-CMS
} else if (match_option(option, "-Xincgc", &tail)) {
FLAG_SET_CMDLINE(bool, UseConcMarkSweepGC, true);
FLAG_SET_CMDLINE(bool, CMSIncrementalMode, true);
内部的には, concurrent に soft-end を変更されても動作するように変更されている.
See: here for details
BlockOffsetArray を用いることで block_start() メソッドを効率的にサポートした ContiguousSpace クラス (See: BlockOffsetArray).
(なお, コメントでは abstract base class と書かれているが, ソース中でインスタンスが生成されている箇所は存在する. もう少し具体的に言うと, CDS 機能使用時に CompactingPermGenGen 内の ro_space 及び rw_space の管理に用いられている)
((cite: hotspot/src/share/vm/memory/space.hpp))
// A ContigSpace that Supports an efficient "block_start" operation via
// a BlockOffsetArray (whose BlockOffsetSharedArray may be shared with
// other spaces.) This is the abstract base class for old generation
// (tenured, perm) spaces.
class OffsetTableContigSpace: public ContiguousSpace {
以下の箇所に(のみ)格納されている.
CompactingPermGenGen::CompactingPermGenGen() 内で(のみ)生成されている.
((cite: hotspot/src/share/vm/memory/compactingPermGenGen.cpp))
CompactingPermGenGen::CompactingPermGenGen(ReservedSpace rs,
ReservedSpace shared_rs,
size_t initial_byte_size,
int level, GenRemSet* remset,
ContiguousSpace* space,
PermanentGenerationSpec* spec_) :
...
// Allocate shared spaces
if (spec()->enable_shared_spaces()) {
...
_ro_space = new OffsetTableContigSpace(_ro_bts,
MemRegion(readonly_bottom, readonly_end));
...
_rw_space = new OffsetTableContigSpace(_rw_bts,
MemRegion(readwrite_bottom, readwrite_end));
See: here for details
TenuredGeneration クラス用の補助クラス (See: TenuredGeneration).
TenuredGeneration 使用時の Old Generation を表すためのクラス (= TenuredGeneration クラス内で実際のメモリ領域の管理を担当するクラス).
((cite: hotspot/src/share/vm/memory/space.hpp))
// Class TenuredSpace is used by TenuredGeneration
class TenuredSpace: public OffsetTableContigSpace {
各 TenuredGeneration オブジェクトの _the_space フィールドに(のみ)格納されている.
TenuredGeneration::TenuredGeneration() 内で(のみ)生成されている.
((cite: hotspot/src/share/vm/memory/tenuredGeneration.cpp))
TenuredGeneration::TenuredGeneration(ReservedSpace rs,
size_t initial_byte_size, int level,
GenRemSet* remset) :
...
{
...
_the_space = new TenuredSpace(_bts, MemRegion(bottom, end));
See: here for details
CompactingPermGenGen クラス用の補助クラス (See: CompactingPermGenGen).
CompactingPermGenGen 使用時の Perm Generation を表すためのクラス. (= CompactingPermGenGen クラス内で実際のメモリ領域の管理を担当するクラス).
((cite: hotspot/src/share/vm/memory/space.hpp))
// Class ContigPermSpace is used by CompactingPermGen
class ContigPermSpace: public OffsetTableContigSpace {
各 CompactingPermGenGen オブジェクトの _the_space フィールドに(のみ)格納されている.
CompactingPermGenGen::CompactingPermGenGen() 内で(のみ)生成されている.
((cite: hotspot/src/share/vm/memory/compactingPermGenGen.cpp))
CompactingPermGenGen::CompactingPermGenGen(ReservedSpace rs,
ReservedSpace shared_rs,
size_t initial_byte_size,
int level, GenRemSet* remset,
ContiguousSpace* space,
PermanentGenerationSpec* spec_) :
...
// Allocate the unshared (default) space.
_the_space = new ContigPermSpace(_bts,
MemRegion(unshared_bottom, heap_word_size(initial_byte_size)));
See: here for details
Space クラス(とそのサブクラス)の処理で使用される補助クラス.
他の OopClosure と組み合わせて使用される Closure クラス (より正確には OopClosure クラス). 「指定した OopClosure の効果をあるアドレス範囲のみに限定したい」という場合に使用される.
((cite: hotspot/src/share/vm/memory/space.hpp))
// An oop closure that is circumscribed by a filtering memory region.
class SpaceMemRegionOopsIterClosure: public OopClosure {
以下の箇所で(のみ)使用されている.
コンストラクタ引数として, OopClosure オブジェクト及びその適用範囲を示す MemRegion を受け取る.
((cite: hotspot/src/share/vm/memory/space.hpp))
SpaceMemRegionOopsIterClosure(OopClosure* cl, MemRegion mr):
実行する処理自体は, コンストラクタ引数で渡された OopClosure を呼び出すだけ.
ただし, 処理対象のアドレスが (同じくコンストラクタ引数で渡された) MemRegion 内に入っていなければ呼び出さない.
((cite: hotspot/src/share/vm/memory/space.cpp))
void SpaceMemRegionOopsIterClosure::do_oop(oop* p) { SpaceMemRegionOopsIterClosure::do_oop_work(p); }
void SpaceMemRegionOopsIterClosure::do_oop(narrowOop* p) { SpaceMemRegionOopsIterClosure::do_oop_work(p); }
See: here for details
See: here for details
write barrier によって dirty 化されているメモリ範囲に対して何らかの処理を行う Closure クラス.
他の OopClosure と組み合わせて使用される Closure クラス (より正確には MemRegionClosureRO クラス). 「指定した OopClosure の効果を dirty 化されている箇所のポインタフィールドのみに限定したい」という場合に使用される (なお, write barrier は多少不正確なので, 指定された MemRegion の外まで処理対象がはみ出す場合もある).
なお, このクラスが想定しているメモリ領域は連続的でもないし境界もない. それ以外のメモリ領域については, 適切なサブクラスを用意している (連続的な領域の場合は ContiguousDCTOC, 境界付きの場合は Filtering_DCTOC, etc).
((cite: hotspot/src/share/vm/memory/space.hpp))
// A MemRegionClosure (ResourceObj) whose "do_MemRegion" function applies an
// OopClosure to (the addresses of) all the ref-containing fields that could
// be modified by virtue of the given MemRegion being dirty. (Note that
// because of the imprecise nature of the write barrier, this may iterate
// over oops beyond the region.)
// This base type for dirty card to oop closures handles memory regions
// in non-contiguous spaces with no boundaries, and should be sub-classed
// to support other space types. See ContiguousDCTOC for a sub-class
// that works with ContiguousSpaces.
class DirtyCardToOopClosure: public MemRegionClosureRO {
現状では, 常に ClearNoncleanCardWrapper とセットで使用されている. 実際に処理範囲を dirty 化されている範囲に絞る作業は ClearNoncleanCardWrapper が行っている (See: ClearNoncleanCardWrapper).
Space::new_dcto_cl() というファクトリメソッドが用意されており, その中で(のみ)生成されている. そして, このファクトリメソッドは, 現在は以下のパスで(のみ)呼び出されている.
(なお, DirtyCardToOopClosure のサブクラス用に Space::new_dcto_cl() がオーバーライドされるケースもある. それらのオーバーライドされたメソッドも同じパスでのみ呼び出されている. (See: ContiguousSpaceDCTOC, FreeListSpace_DCTOC))
* OneContigSpaceCardGeneration 用の処理 OneContigSpaceCardGeneration::younger_refs_iterate() -> Generation::younger_refs_in_space_iterate() -> CardTableRS::younger_refs_in_space_iterate() -> CardTableModRefBS::non_clean_card_iterate_possibly_parallel() -> Space::new_dcto_cl() * CompactingPermGenGen 用の処理 CompactingPermGenGen::younger_refs_iterate() -> CardTableRS::younger_refs_in_space_iterate() -> (同上) * ConcurrentMarkSweepGeneration 用の処理 (CMS 用) ConcurrentMarkSweepGeneration::younger_refs_iterate() -> Generation::younger_refs_in_space_iterate() -> (同上) * ParNew 用の処理 CardTableRS::younger_refs_in_space_iterate() -> CardTableModRefBS::non_clean_card_iterate_possibly_parallel() -> CardTableModRefBS::non_clean_card_iterate_parallel_work() -> CardTableModRefBS::process_stride() -> Space::new_dcto_cl()
ClearNoncleanCardWrapper::do_MemRegion() 内で(のみ)使用されている.
DirtyCardToOopClosure::do_MemRegion() が呼ばれると, 最終的には DirtyCardToOopClosure::walk_mem_region() で処理が行われる. このため, サブクラスを作成する場合は walk_mem_region() メソッドだけをオーバーライドすればいい.
See: here for details
See: here for details
Generation::prepare_for_compaction() 内で使用される補助クラス(StackObjクラス).
Garbage Collection におけるコンパクション処理時に, コンパクション先領域の情報を管理するために使われる.
((cite: hotspot/src/share/vm/memory/space.hpp))
// A structure to represent a point at which objects are being copied
// during compaction.
class CompactPoint : public StackObj {
以下の箇所で(のみ)生成されている.
(正確には, GenMarkSweep::mark_sweep_phase2() の場合は, GenMarkSweep::mark_sweep_phase2() 内で直接生成されているほか, そこから呼び出される GenCollectedHeap::prepare_for_compaction() 内でも生成されている)
Generation::prepare_for_compaction() 内(およびそこから呼び出される補助関数内)で(のみ)使用されている.
単なる構造体のようなクラス. 内部には以下の3つの public フィールドのみを持つ (そしてメソッドはない).
((cite: hotspot/src/share/vm/memory/space.hpp))
public:
Generation* gen;
CompactibleSpace* space;
HeapWord* threshold;
See: here for details
境界を指定可能な DirtyCardToOopClosure クラスの基底クラス. 「指定した OopClosure を dirty 化された領域でかつ指定のアドレス以下の範囲のみに適用したい」という場合に使用される
((cite: hotspot/src/share/vm/memory/space.hpp))
// A dirty card to oop closure that does filtering.
// It knows how to filter out objects that are outside of the _boundary.
class Filtering_DCTOC : public DirtyCardToOopClosure {
なお, このクラス自体は abstract class であり, 実際に使われるのはサブクラス.
((cite: hotspot/src/share/vm/memory/space.hpp))
virtual void walk_mem_region_with_cl(MemRegion mr,
HeapWord* bottom, HeapWord* top,
OopClosure* cl) = 0;
virtual void walk_mem_region_with_cl(MemRegion mr,
HeapWord* bottom, HeapWord* top,
FilteringClosure* cl) = 0;
DirtyCardToOopClosure::walk_mem_region() がオーバーライドされており, 指定したアドレス以上の範囲には OopClosure を適用しないように変更されている (なお, 現在の実装では内部的に FilteringClosure を用いることで実現されている) (See: DirtyCardToOopClosure).
なお, Filtering_DCTOC::walk_mem_region() が呼ばれると, 最終的には Filtering_DCTOC::walk_mem_region_with_cl() で処理が行われる. このため, サブクラスを作成する場合は walk_mem_region_with_cl() メソッドだけをオーバーライドすればいい.
See: here for details
Filtering_DCTOC クラスの具象サブクラスの1つ.
このクラスは ContiguousSpace 用 (= メモリ領域が連続している場合用).
((cite: hotspot/src/share/vm/memory/space.hpp))
// A dirty card to oop closure for contiguous spaces
// (ContiguousSpace and sub-classes).
// It is a FilteringClosure, as defined above, and it knows:
//
// 1. That the actual top of any area in a memory region
// contained by the space is bounded by the end of the contiguous
// region of the space.
// 2. That the space is really made up of objects and not just
// blocks.
class ContiguousSpaceDCTOC : public Filtering_DCTOC {
ContiguousSpace::new_dcto_cl() というファクトリメソッドが用意されており, その中で(のみ)生成されている. そして, このファクトリメソッドは, 現在は以下のパスで(のみ)呼び出されている.
(なお, このパスはオーバーライド元である Space::new_dcto_cl() の呼び出しパスと同一. (See: DirtyCardToOopClosure))
* OneContigSpaceCardGeneration 用の処理 OneContigSpaceCardGeneration::younger_refs_iterate() -> Generation::younger_refs_in_space_iterate() -> CardTableRS::younger_refs_in_space_iterate() -> CardTableModRefBS::non_clean_card_iterate_possibly_parallel() -> Space::new_dcto_cl() * CompactingPermGenGen 用の処理 CompactingPermGenGen::younger_refs_iterate() -> CardTableRS::younger_refs_in_space_iterate() -> (同上) * ConcurrentMarkSweepGeneration 用の処理 (CMS 用) ConcurrentMarkSweepGeneration::younger_refs_iterate() -> Generation::younger_refs_in_space_iterate() -> (同上) * ParNew 用の処理 CardTableRS::younger_refs_in_space_iterate() -> CardTableModRefBS::non_clean_card_iterate_possibly_parallel() -> CardTableModRefBS::non_clean_card_iterate_parallel_work() -> CardTableModRefBS::process_stride() -> Space::new_dcto_cl()
See: here for details
デバッグ用(開発時用)のクラス.
((cite: hotspot/src/share/vm/memory/space.cpp))
class VerifyOldOopClosure : public OopClosure {
OffsetTableContigSpace::verify() 内で(のみ)使用されている.
((cite: hotspot/src/share/vm/memory/space.cpp))
void OffsetTableContigSpace::verify(bool allow_dirty) const {
...
VerifyOldOopClosure blk; // Does this do anything?
blk._allow_dirty = allow_dirty;
...
blk._the_obj = oop(p);
oop(p)->oop_iterate(&blk);
See: here for details
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.