0. はじめに
新卒社員がJavaを初めて学習している際の備忘録のようなものです。超入門だと思うので同郷を救いつつ自分の知識も再確認といったところで、今回初耳だった「ガベージコレクション」について問題を通してまとめました
1. ガベージコレクションについて
ガベージコレクションとは「メモリ上使われなくなったインスタンスを探し、見つかればそのインスタンスを探し、見つかればそれを破棄しメモリを開放すること」です。
そのガベージコレクションのタイミングが問われるのが以下の問題になります
public class Main {
public static void main(String[] args) {
Object a = new Object(); //A
Object b = new Object(); //B
Object c = a;
a = null;
b = null;
}
}
上記のプログラムを実行し、7行目が終了したときにガベージコレクションの対象となるインスタンスはどれか?
- A
- B
- AとB両方
- 対象はない
正解:2. B
正直、初見で見た際にガベージコレクションを知らなくても、英語の意味合いやBだけCに参照していないな。などの判断材料でなんとなく2が正解というのは分かったのですが、4の理由が言えず、、、、
ということで解説していきたいと思います
2. 解説
そもそも、「メモリ上使われなくなったインスタンス」 とはどういうインスタンスなのか?
先ほどもちらっと推測で述べましたが、「参照されなくなったインスタンス」のことです。
また参照がされなくなったインスタンスで代表的なものがnullですね。
Object a = new Object();
a = null; //参照されなくなったインスタンス
nullが代入されたタイミングで変数aは参照されなくなります。
しかし、
Object a = new Object();
Object b = a;
a = null;
上記のコードであると
変数aは参照されなくなりますが、変数bにはインスタンスが生成されたままになっています。
この2点を抑えて、問題を見てみると3行目でインスタンスが生成された後、5行目で別の変数に参照しているので、Aの変数はガベージコレクションの対象にならないことが明白ですね。
またBに関しては、そのままnullが代入されて参照されなくなっているので、ガベージコレクションの対象になります。
よって、この問いの答えは「2. B」となるわけです。
3. 番外編
参照されなくなるタイミングは以下のように明示的に示す場合も存在します。
var fs = new System.IO.FileStream("test.txt",System.IO.FileMode.Open);
//fsを利用して何か処理...
//ストリームを閉じる
fs.Close(); //参照されなくなる