今回はオブジェクトのライフサイクルに関連する問題を解いていきましょう。
問題
次のコードを実行した場合、ガベージ・コレクションによってオブジェクトが破棄される可能性があるのはどのタイミングでしょうか?
public class Main {
public static void main(String[] args) {
Person person1 = new Person("Alice");
Person person2 = new Person("Bob");
person1 = null;
person2 = new Person("Charlie");
// ガベージ・コレクションの実行を試みる
System.gc();
}
}
class Person {
private String name;
Person(String name) {
this.name = name;
}
}
選択肢
- A. “Alice” オブジェクトが即座に破棄される
- B. “Bob” オブジェクトが即座に破棄される
- C. “Charlie” オブジェクトが破棄される
- D. どのオブジェクトが破棄されるかは保証されない
答えと解説
回答を見る
答え
D. どのオブジェクトが破棄されるかは保証されない
解説
基本説明:
Javaでのガベージ・コレクションは、ヒープ内の不要になったオブジェクトを自動的に解放する仕組みです。
プログラムが稼働中にメモリ不足を防ぎ、効率的にメモリを管理することが主な目的です。
コードの中で`System.gc()`が呼ばれると、ガベージ・コレクションを試みることをJVMに要求しますが、この要求はあくまで「試み」であり、実行されることが保証されていません。
誤答理由:
選択肢AやBを選んだ方の理由として、「即座に破棄される」と考えるのは誤解です。
Javaでは、ガベージ・コレクターがいつ実行されるか明確に定義されていないため、`System.gc()`呼び出しのタイミングや効果は保証されません。
したがって、「即座に」という表現は正しくないのです。
つまずきポイント:
初学者はガベージ・コレクションのタイミングや仕様に対して誤解を持ちやすいです。
Javaがどのようにメモリを管理し、オブジェクトがいつ解放されるのかについて知ることは大切です。
オブジェクトの参照がなくなった後に、自動でメモリ解放が行われる仕組みを理解しましょう。
発展知識:
ガベージ・コレクションに関する知識を深めるには、GCのアルゴリズムやトリガー条件を学習するのも良いでしょう。
例えば、Javaでは主に「Mark and Sweep」や「Generational GC」といったアルゴリズムが使われています。
また、`finalize()`メソッドが存在する場合のオブジェクト解放関係について知識を深めると、ガベージ・コレクションの詳細な流れがより理解できるでしょう。