GC の対象になるタイミング
次のメソッドで、new StringBuilder("x") で作ったオブジェクトが GC の対象になるのはいつか。
void run() {
StringBuilder sb = new StringBuilder("x");
sb.append("y");
System.out.println(sb);
}- A run メソッドが終わって変数 sb が無くなったとき
- B append を呼んだとき
- C println を呼んだとき
- D プログラムが終わるまで対象にならない
正解と解説を見る
正解: A
- A: メソッドが終わるとローカル変数 sb が無くなり、どこからも参照されなくなった時点で対象になります。
- B: append は同じ StringBuilder を書き換えるだけで、オブジェクトは置き換わりません。
- C: println の後も、メソッドが終わるまでは sb が参照しています。
- D: 参照が無くなれば、プログラムの途中でも GC の対象になります。
ポイント
- ローカル変数は、メソッドが終わるとスコープを外れて無くなります。そのオブジェクトを参照するものが無くなれば GC の対象です。
- append は同じ StringBuilder を書き換えるだけなので、新しいオブジェクトに置き換わるわけではありません。
「Java クラスの定義とインスタンス化とオブジェクトのライフサイクル」をこのサイトで解く (記録・間違えた問題の解き直し・AI教師への質問)