16

エンジンへの通常の (強い) 参照を持つ車への弱い参照があるとします。車またはエンジンへの他の参照は存在しません。エンジンをガベージ コレクションできますか?

4

3 に答える 3

18

はい、できます。それがまさに、弱参照が機能するように設計されている方法です。弱い参照は、オブジェクトがアプリケーションに対して持っているルートです。オブジェクトに他の強い参照がある場合でも、重要なのはルート参照であり、ルート参照は弱い参照であるため、オブジェクトはガベージ コレクションの候補になります。

詳細については、WeakReferenceクラスのドキュメントを参照してください。

参照先がファイナライズ可能になり、ファイナライズされてから再利用されることを妨げない弱参照オブジェクト。弱参照は、正規化マッピングを実装するために最もよく使用されます。

ある時点でガベージ コレクターが、オブジェクトが弱い到達可能性であると判断したとします。その時点で、そのオブジェクトへのすべての弱参照と、強参照と弱参照のチェーンを介してそのオブジェクトに到達できる他の弱到達可能オブジェクトへのすべての弱参照をアトミックにクリアします。同時に、以前は弱く到達可能だったすべてのオブジェクトがファイナライズ可能であると宣言します。同時に、または後で、参照キューに登録されている、新しくクリアされた弱参照をキューに入れます。

参考までに、Java はとWeakReferenceの 2 つのサブクラスを提供していReferenceます。SoftReferencePhantomReference

于 2010-04-06T12:22:38.487 に答える
8

Car インスタンスガベージ コレクションされる可能性がありますが、次の GC サイクルでガベージ コレクションされるという保証はありません。例えば、

  • GC が実行される前のある時点で、アプリケーションは を呼び出しgetて、到達可能なオブジェクトの属性などにWeakReferenceへの参照を保存できます。Carその後、Carインスタンスは完全に到達可能になり、ガベージ コレクションの対象ではなくなります。

  • 記述されている状態で GC が実行される場合Car、JVM 仕様では、次の GC サイクルで弱い到達可能性が検出されることは保証されません。たとえば、特定の GC サイクルが最新の世代のみを収集する場合 (そして、Car古い世代に昇格されている場合)、GC は到達可能性が低いと判断しません。

  • GCCarが WeakReference 内の への参照を壊した場合でも、Carインスタンスはすぐには回収されません。むしろ、現在到達不能になっているものの再利用は、Carおそらく後の GC サイクルで (可能なファイナライズ後に) 行われます。

于 2010-04-06T13:01:55.843 に答える
1

弱い参照を示す単体テストを次に示します。System.gc() は、オブジェクトがガベージ コレクションされることを保証しないので、依存しないでください。

import junit.framework.TestCase;

import java.lang.ref.WeakReference;

public class WeakReferenceTest extends TestCase {


    class Car {

        Engine engine = new Engine();

    }

    class Engine {

    }

    public void testWeakReferences() {
        WeakReference<Car> carRef = new WeakReference<Car>(new Car());
        assertNotNull(carRef.get());
        System.gc();
        assertNull(carRef.get());
    }

}
于 2010-04-06T12:30:47.673 に答える