2013-06-07 17 views

答えて

7

WeakReferenceと実際に何が起こっているのかわかりません。 javadocは、 "timescales"がそれらをクリア/破棄するためのものであることを明確に述べていません。そして、それはあなたの質問への答えを(少なくとも理論上は) "それは実装に依存しています"。実際、JLSの仕様とjavadocsでは、メジャーコレクションとマイナーコレクションについては言及していません。トピック全体が「実装の詳細」カテゴリにあります。

GCに敏感な参照が必要な場合は、代わりにSoftReferenceを使用する必要があります。次のようにそれを説明する:

「そっと到達可能なオブジェクトは、仮想マシンがOutOfMemoryErrorをスローする前にクリアされていることが保証されている全てのソフト参照は、それ以外の場合は制約がソフト参照した時刻の上に置かれていないでしょう。しかし、仮想マシン実装では、最近作成されたソフトリファレンスや最近使用されたソフトリファレンスを消去することにバイアスをかけることが推奨されています。

他のところでは、弱い参照は弱い参照よりも強く記述されています。その意味は、それが壊れにくいということです。例えばあまりにも熱心なガベージコレクタによって。

しかし、このことについても、主要なマイナーガベージコレクションとマイナーガベージコレクションについては言及していません。

+0

フレンドリーアドバイス、決してSoftReferenceを使用しないでください。 HotSpot JVM SoftReferenceは非常に奇妙な方法で実装されています。 JVMはいつでもSoftReferenceを収集するかどうかを決定します(最後にget()を呼び出すまでの時間です) –

+0

@AlexeyRagozin - javadocと一貫性があり、javadocは**何も言わない**なぜなら、GCが「小さな」ものよりも「大きい」オブジェクトへの参照を壊すようにしたいのであれば、 –

+0

@AlexeyRagozin - 要するに、あなたのアドバイスは十分に確立されていないと思います。 –

5

なぜそれが欲しいですか?あなたのプログラムは、メジャーとマイナーなGCサイクルをあまり気にしてはいけません。そして、実際には、すべてのJVM/GCコンフィグレーションには差別化は存在しません。

WeakReferenceは、オブジェクトへの強い参照がないとすぐに収集可能です。これにはマイナーGCが含まれる可能性があります。

実際にメモリが圧迫されるまでオブジェクトをしばらく固定したい場合は、代わりにSoftReferenceを試してください。

+0

あなたが知る価値のあることを否定することはできません。これは、キャッシュなどを実装しているときなど、大きな違いをもたらします。 –

+1

@PabloFernandez:私は同意しない。あなたのキャッシュの実装の詳細を知っているなら、誰かがJVMをアップグレードしたときに壊れてしまい、なぜデバッグするのが難しいでしょうか。 –

+0

IMHO "できるだけ早く収集"(WeakReferences)と"できるだけ遅く集められる"(SoftReferences)は、あなたのアプリが生きることができないメモリ(例えばキャッシュ)を割り当てるものを実装するときに、知って、価値があり、重要な価値がある –

1

WeakReferenceオブジェクトがEdenにあるかどうかによって異なります。マイナーコレクションでは、Edenのオブジェクトのみが表示されます。

+0

エデンのオブジェクトは、テナント世代に行く前にいくつかの小さなコレクションを生き延びなければならないので、答えは意味がありません –

+1

私はあなたが若い空間、すなわちエデンと生存者の空間を意味し、マイナーコレクションによって収集したと思います。 –

3

あなたが望むものに近いかもしれないSoftReferencesを考えているかもしれません。

マイナーコレクションは、若い空間のオブジェクトをすべて収集します。若い世代のオブジェクトに対する弱い参照は、マイナーGCで収集されます。テナードスペースのオブジェクトに対する弱い参照は、テナントコレクションに収集されます。完全GC。 BTWテナントスペースのみの同時収集を行うことができます。

+1

+1 - これは参考になりますか? (私はあなたの言葉を信じていない...) –

0

WeakReferenceはオブジェクトの収集を妨げません。したがって、オブジェクトが若い空間に属し、弱い参照のみによって到達可能な場合、それは収集されます。

SoftReferences(HotSpot JVM)は、最後のアクセスタイムスタンプ(参照時にget()への最後の呼び出しのタイムスタンプ)に依存する弱い参照または強力な参照のいずれかとして機能します。 sotf参照の「有効期限」は、空きメモリサイズに、-XX:SoftRefLRUPolicyMSPerMB=Tで設定された係数を掛けたものとして計算されます(空きメモリが少ない、ソフト参照の有効期限が短いなど)。

は一般的に、キャッシュのためにJVMの参照を使用することは悪い考えです: - それは 弱い世代仮説を壊し、古い空間に一時オブジェクトを促進する - 参照がマイナーGC時間に

を増やすGCによって、特別な方法で脅威であります追い出し戦略を持つキャッシュが必要な場合は、キャッシュを明示的に実装し、追い出しポリシーに格納されたデータのメモリフットプリントを考慮する方がよいでしょう。

0

まだviguorに思わブライアン・ゲッツ(2006年からの記事)からいくつかの洞察:

Weak References

Soft References - [貧乏人のキャッシュ]で>興味深い内容と[ガベージコレクタが参照を処理する方法]段落。

関連する問題