エンジンへの通常の (強い) 参照を持つ車への弱い参照があるとします。車またはエンジンへの他の参照は存在しません。エンジンをガベージ コレクションできますか?
3 に答える
はい、できます。それがまさに、弱参照が機能するように設計されている方法です。弱い参照は、オブジェクトがアプリケーションに対して持っているルートです。オブジェクトに他の強い参照がある場合でも、重要なのはルート参照であり、ルート参照は弱い参照であるため、オブジェクトはガベージ コレクションの候補になります。
詳細については、WeakReference
クラスのドキュメントを参照してください。
参照先がファイナライズ可能になり、ファイナライズされてから再利用されることを妨げない弱参照オブジェクト。弱参照は、正規化マッピングを実装するために最もよく使用されます。
ある時点でガベージ コレクターが、オブジェクトが弱い到達可能性であると判断したとします。その時点で、そのオブジェクトへのすべての弱参照と、強参照と弱参照のチェーンを介してそのオブジェクトに到達できる他の弱到達可能オブジェクトへのすべての弱参照をアトミックにクリアします。同時に、以前は弱く到達可能だったすべてのオブジェクトがファイナライズ可能であると宣言します。同時に、または後で、参照キューに登録されている、新しくクリアされた弱参照をキューに入れます。
参考までに、Java はとWeakReference
の 2 つのサブクラスを提供していReference
ます。SoftReference
PhantomReference
Car インスタンスはガベージ コレクションされる可能性がありますが、次の GC サイクルでガベージ コレクションされるという保証はありません。例えば、
GC が実行される前のある時点で、アプリケーションは を呼び出し
get
て、到達可能なオブジェクトの属性などにWeakReference
への参照を保存できます。Car
その後、Car
インスタンスは完全に到達可能になり、ガベージ コレクションの対象ではなくなります。記述されている状態で GC が実行される場合
Car
、JVM 仕様では、次の GC サイクルで弱い到達可能性が検出されることは保証されません。たとえば、特定の GC サイクルが最新の世代のみを収集する場合 (そして、Car
古い世代に昇格されている場合)、GC は到達可能性が低いと判断しません。GC
Car
が WeakReference 内の への参照を壊した場合でも、Car
インスタンスはすぐには回収されません。むしろ、現在到達不能になっているものの再利用は、Car
おそらく後の GC サイクルで (可能なファイナライズ後に) 行われます。
弱い参照を示す単体テストを次に示します。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());
}
}