C#のshortまたはlongな弱参照
弱参照(weak reference)は期間で分かれている場合がある。short/longの話題は主に.NET CLRで実装されている WeakReference クラスで説明される。
var obj = new Object();var sp = WeakReference(obj); // short弱参照var lp = WeakReference(obj, true); // long弱参照GCに回収されたとき nil になる参照。状態としては「生存」または「回収済み」の2種類しかない。
オブジェクト(上の例では obj)がファイナライザを実装していて、WeakReference に true を渡したときの参照。状態は以下の3つがある。
- 生存
- GC文脈の昇格(promoted)済みオブジェクトで、ファイナライザが実行キューに入った
- 回収済み
Short vs. Long Weak References and Object Resurrectionによると、Generation 2に存在するオブジェクトの場合、強参照がなくなってGCされると、そのファイナライザが実行キューに入る。ここでオブジェクトの状態としては不定になるが、WeakReference が持つオブジェクトはファイナライザの実行が終わるまで nil にならない。
この不定な状態でファイナライザが実行されたときに強参照が増えると、.NET CLRでのオブジェクト復活が起きる。
ちなみに長い弱参照は、Javaではファントム参照(PhantomReference)と呼ぶらしい。