2

正しい答えを得た後でも、SCJP の質問を理解できません。

次のコード (ソース: http://scjptest.com ) から、 myInt として参照されるオブジェクトがいつガベージ コレクションの対象になるかを判断する必要があります。

01.public void doStuff() {  
02.    Integer arr[] = new Integer[5];  
03.    for (int i = 0; i < arr.length; i++) {  
04.        Integer myInt = new Integer(i);  
05.        arr[i] = myInt;  
06.    }  
07.    System.out.println("end");  
08.}

答えは、6 行目で GC の対象であると述べています。しかし、オブジェクトは 7 行目以降まで GC の対象ではないと思います。なぜなら、myInt として参照されているオブジェクトは arr[i] としても参照されているからです。myInt が範囲外になった後も、arr[] は 8 行目までまだ参照を持っているのではないでしょうか?

4

5 に答える 5

5

SCJPの回答の理由は、6行目には、arrそれを参照する範囲内のステートメントが残っていないためです。通常の状況では、これにより配列とその要素がガベージ コレクションの対象になります。

(Java 言語仕様 (12.6.1) には次のように書かれています。

「到達可能なオブジェクトとは、任意のライブ スレッドから潜在的な継続計算でアクセスできる任意のオブジェクトです。プログラムの最適化変換を設計して、到達可能なオブジェクトの数を単純に到達可能と見なされるオブジェクトよりも少なくすることができます。たとえば、コンパイラまたはコード ジェネレーターは、使用されなくなった変数またはパラメーターを null に設定して、そのようなオブジェクトのストレージをより早く再利用できるようにすることを選択する場合があります。」

ご覧のとおり、到達可能性の実際の定義は、実際にはスコープに基づいていません)。


この質問には別のひねりがあります...

それらが に割り当てられていた場合imyIntオートボクシングは を使用Integer.valueOf(i)し、そのメソッドはIntegerオブジェクトをstaticキャッシュに記録します。このキャッシュにより、オブジェクトは到達可能のままになります...

ただし、Integerインスタンスは を使用して作成されるnewため、キャッシュは発生しません。そして、オブジェクト6 行目で到達できません。

于 2011-04-01T15:16:30.810 に答える
3

arr[i] = myIntnew Integer(i)への参照ではなく、への参照のコピーを作成しますmyInt。したがって、その代入後に myInt が存在する必要は厳密にはありません。

于 2011-04-01T14:57:57.047 に答える
1

一般に信じられていることとは異なり、Javaオブジェクト変数には、オブジェクト自体ではなく、オブジェクトへの参照が含まれています。あるオブジェクト変数が別のオブジェクト変数に割り当てられると、オブジェクトの代わりに参照がコピーされます。AFAIK GCはオブジェクト用であり、参照用ではありません。オブジェクトへの参照が存在しない場合、GCがオブジェクトを要求することは誰もが知っています。

私の意見では、によって参照されるオブジェクトは、関数が戻るmyIntまで収集に使用できません(8行目)。doStuffによって参照されるオブジェクトは、関数が戻るまでスコープ内myIntに格納されます。arr

于 2011-04-01T15:08:19.933 に答える
0

JLS§12.6.1から:

到達可能なオブジェクトとは、ライブスレッドからの潜在的な継続的な計算でアクセスできるオブジェクトです。プログラムの変換を最適化することで、到達可能なオブジェクトの数を、単純に到達可能と見なされるオブジェクトの数よりも少なくするように設計できます。たとえば、コンパイラまたはコードジェネレータは、nullに使用されなくなる変数またはパラメータを設定して、そのようなオブジェクトのストレージをより早く再利用できるようにすることを選択できます。

したがって、この定義では、によって参照される配列arrは6行目以降は到達不能と見なすことができるため、その要素も到達不能です。

于 2011-04-01T15:32:36.410 に答える
0

arr5行目でmyInt最後に参照されています。7行目で参照されていないため、6行目が回答である理由がわかります。

于 2011-04-01T15:17:14.383 に答える