私はちょうどこの記事を読みました:ガベージコレクションについての真実
「A.3.3非表示」のセクションでは、オブジェクトがいつどのようにinvisible
状態になるかについて説明します。
以下のコードでは、変数に割り当てられたオブジェクトはブロックを離れた後にfoo
なり、メソッドが終了するまで強く参照されたままになります(ループは永久に実行されるため、これは発生しません)。invisible
try/catch
run
while
public void run() {
try {
Object foo = new Object();
foo.doSomething();
} catch (Exception e) {
// whatever
}
while (true) { // do stuff } // loop forever
}
それはこの記事で述べられています:
ただし、JVMを効率的に実装すると、参照がスコープ外になったときに参照がゼロになる可能性は低くなります。
なぜそれは効率的ではないのですか?
私の説明の試みは次のとおりです。
このメソッドのスタックに4つの要素が含まれていて、現在は表示されていないオブジェクトが下部にあるとします。
オブジェクトを即座に収集したい場合は、3つの要素をポップして保存し、4番目の要素をポップして破棄してから、まだ有効な3つの要素をスタックにプッシュして戻す必要があります。
制御フローがメソッドを離れた後に非表示のオブジェクトを収集するrun
と、VMは4つの要素すべてをポップして、それらを破棄することができます。