1

SoftReference、、はWeakReferencePhantomReferenceガベージコレクションのプロセスをカスタマイズするために使用できます。それらはすべて拡張Reference<T>されているため、1つのコレクションに混在させることができます。ハードリファレンス(最も一般的なもの)は拡張Reference<T>されないため、1つのコレクションにハードリファレンスと他のタイプのリファレンスを混在させることはできません。私は正しいのでCustomReference<T> extends Reference<T>、すべてのタイプのオブジェクトリンクを単一のコレクションに混合するという望ましい結果を達成するためにコレクションに入れる必要があります(Collection<Reference<T>>)?

更新:SSCCEを作成するときに、通常の方法で拡張することはできないことがわかりましたReference<T>(コンストラクターはパッケージローカルです)。

したがって、質問は次のように更新されます。単一のコレクションクラスを使用して、常に一部のオブジェクト(たとえば、10)を保持するキャッシュを作成し、メモリが許可されていない場合に他のオブジェクトをGCによって再利用できますか?ハード参照とソフト参照のカスタムラッパーを提供し、それらをコレクションに保存する以外に、これを行う他の手段はありますか?

4

2 に答える 2

2

ホストプロセスのメモリが不足するまで参照オブジェクトを存続させたい場合は、 SoftReferenceを使用します。コレクターがメモリーを解放する必要があるまで、オブジェクトは収集の対象になりません。大まかに言うと、SoftReferenceをバインドすると、「オブジェクトを固定できなくなるまで固定する」という意味になります。

対照的に、参照されるオブジェクトの存続期間に影響を与えたくない場合は、 WeakReferenceを使用します。参照されているオブジェクトが存続している限り、それについて別のアサーションを作成するだけです。オブジェクトの収集の適格性は、バインドされたWeakReferencesの存在に影響されません。オブジェクトインスタンスから関連プロパティへの外部マッピングのようなもので、関連オブジェクトが存続している限りプロパティを記録するだけでよいので、WeakReferencesとWeakHashMapを使用すると便利です。

最後の1つであるPhantomReferenceは、特徴付けが困難です。WeakReferenceと同様に、このようにバインドされたPhantomReferenceは、参照されるオブジェクトの存続期間に影響を与えません。ただし、他の参照型とは異なり、PhantomReferenceを逆参照することさえできません。ある意味では、発信者が言うことができる限り、それはそれが指しているものを指していません。これは、いくつかの関連データを参照オブジェクトに関連付けることを可能にするだけです。データは、後でPhantomReferenceが関連するReferenceQueueのキューに入れられたときに検査し、処理することができます。通常、PhantomReferenceから型を派生させ、その派生型にいくつかの追加データを含めます。残念ながら、そのような派生型を利用するためにいくつかのダウンキャストが含まれています。

このリンクの詳細

http://download.oracle.com/javase/7/docs/api/java/lang/ref/package-summary.html

もう1つのリンクを追加しました http://weblogs.java.net/blog/enicholas/archive/2006/05/understanding_w.html

于 2011-06-24T06:23:21.433 に答える
2

残念ながら、JavaDocReference<T>によると、ほとんどの場合、直接サブクラス化することはできません(できません)。

参照オブジェクトはガベージコレクターと緊密に連携して実装されるため、このクラスを直接サブクラス化することはできません。

そのため、同じでソフト/ウィーク/ファントム参照と通常の参照のinstanceof両方を簡単に(つまり、醜い+キャストなしで)処理することはできません。Collection

2つの別々のオブジェクトを使用して通常の参照とソフト/ウィーク/ファントム参照を処理するラッパー、またはそれらすべてを同じものに入れ、キャストによる適切なチェックを使用してオブジェクトを区別するラッパーを作成できます。CollectionCollection<Object>instanceof

于 2011-06-24T06:28:14.213 に答える