2011-08-15 10 views
0

からhttp://java.sun.com/docs/books/performance/1st_edition/html/JPAppGC.fm.html#99740例A3.3では、範囲外であってもオブジェクトがまだガベージコレクションに使用できない可能性があることを示しています。 ITは、メソッドがスタックから削除された場合にのみ使用できます。私たちは次のような場合を考慮すれば、今すぐ:オブジェクトはガベージコレクションの準備ができています。

void foo(){ 
Dog a = new Dog(); 
Dog b = new Dog(); 
b=a 
while(true)//loop for long time 
} 

は、オブジェクトbは、ガベージコレクションのためにすぐに利用可能であることを言及するのでしょうか、FOO()メソッドが返された後にのみ。

+1

オブジェクト 'b'は、最初に' a'と同じオブジェクトに再割り当てされる前に参照されていました。 – Thilo

答えて

4

スタックスロットは、メソッドが終了するまで使用されたままです。内部に対応するJVMオペコードはありません}ので、JVMは内部スコープから外れていることを認識しません。しかし、メソッドがいつ戻るかはわかります。

+0

Oこれは明らかに、ありがとうたくさん:) – Jatin

+1

+1。スタックスロットが使用されたままであっても、割り当てられた* last *オブジェクトは保持されます。メソッドの終了を待つことができない場合は、nullに設定することもできます。 – Thilo

2

犬は、変数を再割り当てするとすぐにbがガベージコレクションの対象になるはずです。

abの両方として知られている犬(その再割り当て後)は、方法の最後まで範囲内にとどまります。これに保持されたいかなる参照(b基準作成Dog両方aと)がないため

1

b(生成された第2 Dog)は、ループの開始前に、ガベージコレクションのためにすぐに利用可能です。

+0

その場合は:public void run(){ try { Object foo = new Object(); foo.doSomething(); }キャッチ(例外e){ //どんな } ながら、(真){//}ものを行う//ループ永遠 }なぜ@Jatin戻り – Jatin

+0

を実行する場合にのみ、オブジェクトfooは、ガベージコレクションのために利用可能であるということです。私はそれが事実であるとは思わない。これらの孤児院はすべて回収されます。 – Thilo

0

正解を除いて、テストには本質的に欠陥があります。実行中の空のwhileループはメモリを使い果たし、古いオブジェクトのクリーンアップを行う必要があるときに実行する(ビットを単純化するために)GCを起動することはありません。

+0

永遠に私はそれの中にコードのブロックで長い間ループしている間に意味します。オブジェクトがすぐに利用可能になるか、メソッドが返された後 – Jatin

+0

@Jatin:メソッドが返る前に 'a'または' b'をどうすれば集めることができますか?結局のところ、それらはまだ範囲内にあり、例えばループ内で使用することができる。 (賢明なコンパイラは、実際に使用されているかどうかを調べ、スコープを短くすることができますが、コードごとにメソッドと同じスコープがあります)。 – Thilo

+0

これは基本的には、メソッドが返されたときにのみオブジェクトがガベージコレクションに使用できることを意味しますか?この場合はaとb – Jatin

関連する問題