- PR -

ガベージコレクションの対象となるタイミングについて

投稿者投稿内容
忍者鳥取県
ベテラン
会議室デビュー日: 2003/08/28
投稿数: 61
お住まい・勤務地: リオネジャネイロの地下6000Km
投稿日時: 2003-11-14 16:53
現在Sun認定資格Javaプログラマーの勉強をしているのですが、
例題のなかに次のような2つの問題がありました。
(下記の2つの問題はそれぞれ別の会社の問題です。 )


【問題1】下記プログラムにて"Hello"がガベージコレクションの対象になるのは 
     いつか?
コード:

public class Sample {
public static void main(String args[]){
String a = new String("Hello");
String b = a;
a = null;
b = null;
System.out.println("Bye");
}
}


【問題2】下記プログラムにて"ABC"がガベージコレクションの対象になるのは
   いつか?
コード:

public class Sample {
public static void main(String args[]){
String[] b = new String[1];
String a = "ABC";
b[0] = a;
a = null;
b[0] = null;
b = null;
System.out.println("Bye");
}
}


正解 【問題1】b = null の直後
   【問題2】a = null の直後

 この結果がいまいち腑に落ちないのですが、
まず、問題1に関しては String b = a と
bとaが同じオブジェクトを参照しています。
その後、a = null としていますが、bはまだ
"Hello"オブジェクトを参照しているので
ガベージコレクションの対象にならず、b = null
でガベージコレクションの対象になる。というのは合点がいきます。

しかし、同じような問題の問題2のほうですが、なぜか正解が
a = null の時と言うことでした、、、。

疑問に思ったので、早速問題2のプログラムで上記のコードを実行させ
デバッガでデバッグしのたですが、a=nullを実行した後もb[0]="ABC"
となっています。これは、問題2の答え自体がまちがっているのでしょうか?
はたまた、わたしが未熟なためにわからないなにか別の問題があるのでしょうか?
宜しければどなたかご教示お願いします。m(_ _)mペコリンコ

 

[ メッセージ編集済み 編集者: 忍者鳥取県 編集日時 2003-11-14 16:58 ]
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2003-11-14 17:04
unibon です。こんにちわ。

#題意を酌みとって考えました。

> 【問題1】下記プログラムにて"Hello"がガベージコレクションの対象になるのは 
>      いつか?

b = null;
の後の任意のタイミングで(実行環境に依存)。


> 【問題2】下記プログラムにて"ABC"がガベージコレクションの対象になるのは
>    いつか?

b[0] = null;
の後の任意のタイミングで(実行環境に依存)。

引用:

忍者鳥取県さんの書き込み (2003-11-14 16:53) より:
正解 【問題1】b = null の直後
   【問題2】a = null の直後


うむむ。

なお、細かく考えると、多くの実装系ではメソッドを抜けないと
ガーベッジコレクションが動かないことも多かったかもしれません。
あるいは対象を"Hello" と考えるのか new String("Hello") なのかや、
"ABC" 自体はそもそもガーベッジコレクションになるのかは、
相当良く知っている人ではないと答えられないのですが、
まさか試験でそこまで問うことはないでしょう。
とんび
常連さん
会議室デビュー日: 2003/07/11
投稿数: 32
投稿日時: 2003-11-14 17:30
引用:

"ABC" 自体はそもそもガーベッジコレクションになるのかは、
相当良く知っている人ではないと答えられないのですが、
まさか試験でそこまで問うことはないでしょう。



文字列定数はコンスタントプールに格納されるから、
ガーベージコレクションされないんじゃなかったでしたっけ?
びしばし
大ベテラン
会議室デビュー日: 2002/03/13
投稿数: 181
投稿日時: 2003-11-14 18:26
ここで議論するより、その問題集の作成者に訊くほうが確実のような気がします。

私も問題 2は腑に落ちませんので、ぜひともその作成者の見解をお聞きしたいです。問い合わせをお願いします。
忍者鳥取県
ベテラン
会議室デビュー日: 2003/08/28
投稿数: 61
お住まい・勤務地: リオネジャネイロの地下6000Km
投稿日時: 2003-11-14 18:45
引用:

びしばしさんの書き込み (2003-11-14 18:26) より:
ここで議論するより、その問題集の作成者に訊くほうが確実のような気がします。

私も問題 2は腑に落ちませんので、ぜひともその作成者の見解をお聞きしたいです。問い合わせをお願いします。



この問題はネットでJavaの問題集を販売してるサイトの
サンプルです。そのため、正面きって問い合わせってのが
ちと、つらい状況です(・_・、)ゴメリンコ

参考:
http://www.crammedia.com/indexjp.asp
びしばし
大ベテラン
会議室デビュー日: 2002/03/13
投稿数: 181
投稿日時: 2003-11-14 19:29
サンプルだから問い合わせられない、という理由が不明ですが、ゴメリンコなんて言っている余裕があるなら大丈夫ですね。

まあ試験がんばってください。
忍者鳥取県
ベテラン
会議室デビュー日: 2003/08/28
投稿数: 61
お住まい・勤務地: リオネジャネイロの地下6000Km
投稿日時: 2003-11-14 19:49
引用:

びしばしさんの書き込み (2003-11-14 19:29) より:
サンプルだから問い合わせられない、という理由が不明ですが、ゴメリンコなんて言っている余裕があるなら大丈夫ですね。

まあ試験がんばってください。



、、、ですね。
先ほど問い合わせのメール出しておきました。
もし、なんらかの回答がありましたら掲載したいと思います。

ちなみにびしばしさんは、どのような点が腑に落ちないのでしょうか?
宜しければ、びしばしさんの意見もお聞かせください。
未記入
ぬし
会議室デビュー日: 2002/03/28
投稿数: 255
投稿日時: 2003-11-14 23:07
>>"ABC" 自体はそもそもガーベッジコレクションになるのかは、
>文字列定数はコンスタントプールに格納されるから、
>ガーベージコレクションされないんじゃなかったでしたっけ?
正確には共有プールか何かに保存されているんだと思います.
これ自体もGCの対象ではあるんでしょうが,おそらくは
クラス自体が回収されないことには回収されないでしょう.

いずれにせよ,不適切な問題なのは間違いないでしょう.

なにせGCの回収の対象になるかならないかは,GCの実装に依存します.
「参照カウント 循環参照」,「保守的GC」辺りをキーワードに検索すれば
手がかりくらいはひっかかるでしょう.

スキルアップ/キャリアアップ(JOB@IT)