これらは, Garbage Collection 処理用の補助クラス. より具体的に言うと, 参照オブジェクト (java.lang.ref オブジェクト) の GC 処理において 「いつ soft reference が GC されるべきか」という判断を行うクラス (See: here for details).
((cite: hotspot/src/share/vm/memory/referencePolicy.hpp))
// referencePolicy is used to determine when soft reference objects
// should be cleared.
これらのクラスは以下のような継承関係を持つ (ReferencePolicy クラスが基底クラスで, その下に異なる policy を実装した4つのサブクラスがある).
なお, 判断は ReferencePolicy::should_clear_reference() が返す boolean 値で示される.
LRUCurrentHeapPolicy と LRUMaxHeapPolicy の場合は, 以下の値を使用して判断を行う (timestamp フィールドの値がある閾値以前であればアクセス頻度が少ないと判断して消去する).
((cite: jdk/src/share/classes/java/lang/ref/SoftReference.java))
public class SoftReference<T> extends Reference<T> {
/**
* Timestamp clock, updated by the garbage collector
*/
static private long clock;
/**
* Timestamp updated by each invocation of the get method. The VM may use
* this field when selecting soft references to be cleared, but it is not
* required to do so.
*/
private long timestamp;
soft reference の消去に関する判断を行うクラス (の基底クラス).
((cite: hotspot/src/share/vm/memory/referencePolicy.hpp))
class ReferencePolicy : public CHeapObj {
なお, このクラス自体は abstract class であり, 実際に使われるのはサブクラス.
See: here for details
ReferencePolicy クラスの具象サブクラスの1つ.
どんな場合でも soft reference は全て残す(消去しない).
((cite: hotspot/src/share/vm/memory/referencePolicy.hpp))
class NeverClearPolicy : public ReferencePolicy {
(このクラスは使用箇所が見当たらないが... #TODO)
その名の通り, should_clear_reference() メソッドは常に false を返す.
((cite: hotspot/src/share/vm/memory/referencePolicy.hpp))
bool should_clear_reference(oop p) { return false; }
See: here for details
ReferencePolicy クラスの具象サブクラスの1つ.
どんな場合でも soft reference を全て消去する.
((cite: hotspot/src/share/vm/memory/referencePolicy.hpp))
class AlwaysClearPolicy : public ReferencePolicy {
ReferencePolicy クラスの _always_clear_soft_ref_policy フィールド (static フィールド) に(のみ)格納されている.
((cite: hotspot/src/share/vm/memory/referenceProcessor.hpp))
// . the "clear all" policy
static ReferencePolicy* _always_clear_soft_ref_policy;
ReferenceProcessor::init_statics() 内で(のみ)生成されている.
((cite: hotspot/src/share/vm/memory/referenceProcessor.cpp))
_always_clear_soft_ref_policy = new AlwaysClearPolicy();
ReferenceProcessor の処理中で使用されている (See: here for details).
なお AlwaysClearPolicy が使用されるかどうかは, 参照オブジェクト処理の開始前に呼び出される ReferenceProcessor::setup_policy() への引数で決定される. ReferenceProcessor::setup_policy() に true が渡されると always_clear_soft_ref_policy の値 (= AlwaysClearPolicy オブジェクト) が使用される. (逆に false が渡された場合は _defaultsoft_ref_policy の値 (= LRUCurrentHeapPolicy または LRUMaxHeapPolicy) が使われる)
See: here for details
その名の通り, should_clear_reference() メソッドは常に true を返す.
((cite: hotspot/src/share/vm/memory/referencePolicy.hpp))
bool should_clear_reference(oop p) { return true; }
See: here for details
ReferencePolicy クラスの具象サブクラスの1つ.
(メモリの消費速度と照らし合わせて) アクセスされる頻度が一定以下の soft reference を解放する.
なお, LRUMaxHeapPolicy との違いは, メモリの消費速度の計算時に (ヒープの最大長ではなく)現在のヒープ長を基準とする点.
((cite: hotspot/src/share/vm/memory/referencePolicy.hpp))
class LRUCurrentHeapPolicy : public ReferencePolicy {
ReferencePolicy クラスの _default_soft_ref_policy フィールド (static フィールド) に(のみ)格納されている.
((cite: hotspot/src/share/vm/memory/referenceProcessor.hpp))
// . the default policy
static ReferencePolicy* _default_soft_ref_policy;
ReferenceProcessor::init_statics() 内で(のみ)生成されている.
(なお LRUCurrentHeapPolicy が生成されるかどうかはビルド設定によって決まる. COMPILER2_PRESENT の場合は LRUMaxHeapPolicy が生成され, そうでない場合は LRUCurrentHeapPolicy が生成される)
((cite: hotspot/src/share/vm/memory/referenceProcessor.cpp))
_default_soft_ref_policy = new COMPILER2_PRESENT(LRUMaxHeapPolicy())
NOT_COMPILER2(LRUCurrentHeapPolicy());
ReferenceProcessor の処理中で使用されている (See: here for details).
なお LRUCurrentHeapPolicy が使用されるかどうかは, 参照オブジェクト処理の開始前に呼び出される ReferenceProcessor::setup_policy() への引数で決定される. ReferenceProcessor::setup_policy() に false が渡されると default_soft_ref_policy の値 (= LRUCurrentHeapPolicy または LRUMaxHeapPolicy) が使用される. (逆に true が渡された場合は _alwaysclear_soft_ref_policy の値 (= AlwaysClearPolicy オブジェクト) が使われる)
See: here for details
LRUCurrentHeapPolicy オブジェクトの生成時に, コンストラクタ内で基準となる時間(_max_interval)が計算されている.
そして実際の判断処理では, 判断対象の soft reference のアクセス間隔をその基準時間(_max_interval)と比較することで消去するかどうかを決めている.
See: here for details
See: here for details
See: here for details
See: here for details
ReferencePolicy クラスの具象サブクラスの1つ.
(メモリの消費速度と照らし合わせて) アクセスされる頻度が一定以下の soft reference を解放する.
なお, LRUCurrentHeapPolicy との違いは, メモリの消費速度の計算時に (現在のヒープ長ではなく)ヒープの最大長を基準とする点.
((cite: hotspot/src/share/vm/memory/referencePolicy.hpp))
class LRUMaxHeapPolicy : public ReferencePolicy {
ReferencePolicy クラスの _default_soft_ref_policy フィールド (static フィールド) に(のみ)格納されている.
((cite: hotspot/src/share/vm/memory/referenceProcessor.hpp))
// . the default policy
static ReferencePolicy* _default_soft_ref_policy;
ReferenceProcessor::init_statics() 内で(のみ)生成されている.
(なお LRUMaxHeapPolicy が生成されるかどうかはビルド設定によって決まる. COMPILER2_PRESENT の場合は LRUMaxHeapPolicy が生成され, そうでない場合は LRUCurrentHeapPolicy が生成される)
((cite: hotspot/src/share/vm/memory/referenceProcessor.cpp))
_default_soft_ref_policy = new COMPILER2_PRESENT(LRUMaxHeapPolicy())
NOT_COMPILER2(LRUCurrentHeapPolicy());
ReferenceProcessor の処理中で使用されている (See: here for details).
なお LRUMaxHeapPolicy が使用されるかどうかは, 参照オブジェクト処理の開始前に呼び出される ReferenceProcessor::setup_policy() への引数で決定される. ReferenceProcessor::setup_policy() に false が渡されると default_soft_ref_policy の値 (= LRUCurrentHeapPolicy または LRUMaxHeapPolicy) が使用される. (逆に true が渡された場合は _alwaysclear_soft_ref_policy の値 (= AlwaysClearPolicy オブジェクト) が使われる)
See: here for details
LRUMaxHeapPolicy オブジェクトの生成時に, コンストラクタ内で基準となる時間(_max_interval)が計算されている.
そして実際の判断処理では, 判断対象の soft reference のアクセス間隔をその基準時間(_max_interval)と比較することで消去するかどうかを決めている.
See: here for details
See: here for details
See: here for details
See: here for details
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.