これらは, G1GC で使用するメモリ領域の統計情報を管理するためのクラス.
HeapRegionSet は, 複数の HeapRegion からなる集合 (の統計情報) を管理するためのクラス. 例えば, 集合の要素数(含まれる HeapRegion の個数), 合計のメモリ量, 等を記録している.
なお, サブクラスの HeapRegionLinkedList では, 集合に含まれる HeapRegion オブジェクト1つ1つまで管理している.
それ以外のクラスでは, 実際にどういう HeapRegion が含まれているかは管理していない.
#ifdef ASSERT
時にだけは HeapRegionLinkedList 以外でもどういう HeapRegion を含んでいるかを管理しているが,
この場合も対応関係は HeapRegionSet ではなく HeapRegion オブジェクトの方に記録されている
(HeapRegion::_containing_set フィールド参照)
なお, これらのクラスは以下のような継承関係を持つ.
全ての HeapRegionSet クラスの基底クラス. サブクラスで共通して使われる基本的なフィールドやメソッドを提供している (length, region num, used bytes sum, verification(), etc).
なお, このクラス自体は abstract class であり, 実際に使われるのはサブクラス.
((cite: hotspot/src/share/vm/gc_implementation/g1/heapRegionSet.hpp))
// Base class for all the classes that represent heap region sets. It
// contains the basic attributes that each set needs to maintain
// (e.g., length, region num, used bytes sum) plus any shared
// functionality (e.g., verification).
((cite: hotspot/src/share/vm/gc_implementation/g1/heapRegionSet.hpp))
class HeapRegionSetBase VALUE_OBJ_CLASS_SPEC {
See: here for details
HeapRegionSetBase クラスのサブクラスの1つ. 集合に含まれる HeapRegion オブジェクト1つ1つまで記録しない HeapRegionSet クラスの基底クラス (記録する場合の基底クラスは HeapRegionLinkedList).
なお, このクラス自体は abstract class であり, 実際に使われるのはサブクラス.
((cite: hotspot/src/share/vm/gc_implementation/g1/heapRegionSet.hpp))
// This class represents heap region sets whose members are not
// explicitly tracked. It's helpful to group regions using such sets
// so that we can reason about all the region groups in the heap using
// the same interface (namely, the HeapRegionSetBase API).
class HeapRegionSet : public HeapRegionSetBase {
(スーパークラスである HeapRegionSetBase クラスのメソッドに加えて) 集合に HeapRegion を追加/削除するための HeapRegionSet::add(), HeapRegionSet::remove() 等が定義されている (それぞれ HeapRegionSetBase::add_internal(), HeapRegionSetBase::remove_internal() を呼んでいるだけだが...).
また, マルチスレッド時に remove が競合して遅くならないように, thread local なコピーを作る HeapRegionSet::remove_with_proxy() と, コピーの結果を本体に反映させるための HeapRegionSet::update_from_proxy() も備えている.
((cite: hotspot/src/share/vm/gc_implementation/g1/heapRegionSet.hpp))
// It adds hr to the set. The region should not be a member of
// another set.
inline void add(HeapRegion* hr);
// It removes hr from the set. The region should be a member of
// this set.
inline void remove(HeapRegion* hr);
// It removes a region from the set. Instead of updating the fields
// of the set to reflect this removal, it accumulates the updates
// in proxy_set. The idea is that proxy_set is thread-local to
// avoid multiple threads updating the fields of the set
// concurrently and having to synchronize. The method
// update_from_proxy() will update the fields of the set from the
// proxy_set.
inline void remove_with_proxy(HeapRegion* hr, HeapRegionSet* proxy_set);
// After multiple calls to remove_with_proxy() the updates to the
// fields of the set are accumulated in proxy_set. This call
// updates the fields of the set from proxy_set.
void update_from_proxy(HeapRegionSet* proxy_set);
See: here for details
HeapRegionSetBase クラスのサブクラスの1つ. 集合に含まれる HeapRegion オブジェクト1つ1つまで記録する HeapRegionSet クラスの基底クラス (記録しない場合の基底クラスは HeapRegionSet).
なお, このクラス自体は abstract class であり, 実際に使われるのはサブクラス.
名前の通り, 内部では HeapRegion を linked list 状につないで管理している. 性能上クリティカルなところで HeapRegionLinkedList 中の HeapRegion を辿るのはおすすめしない, とのこと (大抵の場合は HeapRegion を 1つ add/remove したり 2つの HeapRegionLinkedList を append するという使い方になるはずで, これらであれば(linked list なので)定数時間だから問題ない, とのこと).
((cite: hotspot/src/share/vm/gc_implementation/g1/heapRegionSet.hpp))
//////////////////// HeapRegionLinkedList ////////////////////
// A set that links all the regions added to it in a singly-linked
// list. We should try to avoid doing operations that iterate over
// such lists in performance critical paths. Typically we should
// add / remove one region at a time or concatenate two lists. All
// those operations are done in constant time.
((cite: hotspot/src/share/vm/gc_implementation/g1/heapRegionSet.hpp))
class HeapRegionLinkedList : public HeapRegionSetBase {
内部では, head/tail というフィールドに HeapRegion を格納している (リスト自体は HeapRegion オブジェクトの _next フィールドを用いて構築).
((cite: hotspot/src/share/vm/gc_implementation/g1/heapRegionSet.hpp))
HeapRegion* _head;
HeapRegion* _tail;
See: here for details
HeapRegionSetBase クラス(及びそのサブクラス)内で使用される補助クラス.
HeapRegionSetBase 用の FormatBuffer クラス (hrs_err_msg は FormatBuffer の別名 (See: FormatBuffer)).
コメントによると, HeapRegionSetBase の friend class になっているので(?), HeapRegionSet 内のフィールドの値にもアクセスでき, より詳細なエラー情報が出せる, とのこと (See: HeapRegionSetBase::fill_in_ext_msg()).
((cite: hotspot/src/share/vm/gc_implementation/g1/heapRegionSet.hpp))
// Customized err_msg for heap region sets. Apart from a
// assert/guarantee-specific message it also prints out the values of
// the fields of the associated set. This can be very helpful in
// diagnosing failures.
class hrs_ext_msg : public hrs_err_msg {
HeapRegionSet 中の様々な箇所で (主に assert/guarantee 用の文字列を構築する用途で) 使用されている.
See: here for details
デバッグ用(開発時用)のクラス(??) (#ifdef ASSERT 時にしか使用されない? #TODO).
HeapRegionLinkedList 内の要素をたどるためのイテレータクラス(StackObjクラス).
((cite: hotspot/src/share/vm/gc_implementation/g1/heapRegionSet.hpp))
//////////////////// HeapRegionLinkedListIterator ////////////////////
// Iterator class that provides a convenient way to iterate over the
// regions of a HeapRegionLinkedList instance.
class HeapRegionLinkedListIterator : public StackObj {
以下の箇所で(のみ)使用されている.
See: here for details
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.