3

Javaにはソフト参照の概念があることを知っています。仮に:

1) オブジェクト A を参照するソフト参照 "sf" があります

2)オブジェクトAでは、オブジェクトBを参照する強い参照があります

3) オブジェクト A と B は他のどこにも参照されていません。

定義上、オブジェクト A とオブジェクト B はどちらも「そっと到達可能」ですよね?

次に、メモリが不足していると GC が起動します。GC がオブジェクト B をリサイクルするが、オブジェクト A をリサイクルしないということは可能でしょうか?

その場合、後で「sf」を介してオブジェクト B にアクセスする場合は、null になります。どのようにjavaがそのようなケースを回避するのですか?

Java docに説明がありません。

4

3 に答える 3

2

GC のトレースが基本的にどのように機能するかについて簡単に紹介すると、問題が解決するはずです。

トレーシング GC (Java と .NET で使用されるものはすべてそのカテゴリに分類されます) には、いわゆる のセットがありroot pointers、それらはグローバル変数 (Java ではクラスの静的変数を意味します) とスタックフレーム内のすべてのライブ変数です。GC はこれらをトラバースし、生きているすべてのオブジェクトをマークします。つまり、少なくとも 1 つのルート ポインターからの参照を通じて到達可能です。完了すると、すべてのライブ変数がマークされ、残りはガベージ コレクションできます。

ソフト参照は、2 つの異なる方法で処理できるようになりました。a) ソフト参照に従って、その中のすべてのオブジェクトをマークするか、b) マークしません。正確に何が起こるかは、特定の JVM 実装に左右されますが、それが決定された後は、他に違いはありません。

したがって、次の 2 つのシナリオが考えられます。

  • GC は A へのソフト参照に従います。この場合、2 つのオブジェクトのいずれも GC されません。
  • GC は A へのソフト参照に従いません (そして A へのハード参照はありません)。A は GCed であり、ライブ オブジェクトがそれへの参照を持っていない場合、B は GCed です。
于 2012-05-15T00:18:08.480 に答える
1

ドキュメントから:

「オブジェクトは、強く到達できない場合はソフトに到達できますが、ソフト参照をトラバースすることで到達できます。」

「オブジェクトは、参照オブジェクトをトラバースせずに何らかのスレッドで到達できる場合、強力に到達可能です。」

それはかなり明確だと思います。Bは、ソフト参照をトラバースすることによってのみ到達可能であるため、ソフト到達可能です。

上記のドキュメント

于 2012-05-14T23:51:26.220 に答える