ガベージコレクションについて
ガベージコレクションとは
ガベージコレクションとは、「不要なインスタンスを破棄することで、メモリ領域を解放すること」で、JVMの機能の1つである「ガベージコレクタ」によって自動実行されます。
ガベージコレクションは、CPUの利用状況などによってJVMが自動で実行するもので、プログラマがガベージコレクションのタイミングを制御することはできません。
※Systemクラスにはガベージコレクションを促す「gcメソッド」というメソッドがありますが、あくまでJVMに実行を促すだけのもので、必ずガベージコレクションを実行するものではありません。
また、ガベージコレクションの対象は「どこからも参照されなくなったインスタンス」です。
ガベージコレクションの意義 その1
インスタンスはメモリ上に生成されますが、無制限にインスタンスが生成された場合、メモリ領域を使い切ってしまうことになります。
その結果、インスタンス生成ができなくなるなど、プログラムの実行に支障をきたす可能性があります。
メモリには限りがあるので、利用されていないインスタンスを破棄することで、メモリ領域の有効利用を維持することができます。
ガベージコレクションの意義 その2
C言語などでは、メモリの確保や開放に関しては、プログラムにて制御する必要があります。
プログラムでの制御にはメリット・デメリットがあります。
メリットとしては「メモリ領域操作の自由度」があげられますが、
デメリットとしては「プログラムでメモリ操作をする難易度の高さ」があり、これはシステム開発の生産性に大きな影響を与えるほどの要因となります。
一方、Javaでは、JVMが自動でメモリ領域を管理することができるため、プログラマーはメモリ操作といった煩雑なコーディングに時間を割く必要がなくなり、生産性の高いシステム開発を実現することができます。
Javaにおいて、どこからも参照されてないインスタンスを使用することはできません。
JVMは、こうした不要なインスタンスがないか常に監視し、破棄することで、常にメモリ領域を効率的に維持してくれています。
ガベージコレクションの実行タイミング
JVMによって自動で実行されるガベージコレクションですが、代表的な実行タイミングとして以下のタイミングがあります。
- どこからも参照されなくなったインスタンスが検知された時
- 変数にnullが代入された時
- インスタンスへの参照を保持する変数に、別のインスタンスへの参照を代入した時
・変数にnullが代入された時 Hoge hoge = new Hoge(); ←Hogeインスタンス生成 hoge = null; ←Hogeインスタンスへの参照が外れる
・インスタンスへの参照を保持する変数に、別インスタンスへの参照を代入したとき Hoge hoge = new Hoge(); ←Hogeインスタンス生成 hoge = new Hoge(); ←新たなHogeインスタンス生成 もともとのHogeインスタンスへの参照が外れる
例題
次のコードが順番に実行された場合、ガベージコレクションの対象となるインスタンスは「インスタンス1」「インスタンス2」どちらでしょう。
Object aaa = new Object(); ←インスタンス1 Object bbb = new Object(); ←インスタンス2 Object ccc = aaa; aaa = null; bbb = null;
正解は、「インスタンス2」となります。
解説
インスタンス1への参照を持つ「aaa変数」に「null」が代入されていますが、
その前に、「ccc変数」にインスタンス1への参照が代入されています。
よって 、「aaa変数」に「null」が代入されても、インスタンス1への参照は「ccc変数」が保持しているため、ガベージコレクションの対象にはなりません。
しかし、
インスタンス2への参照は「bbb変数」しか保持しておらず、「bbb変数」に「null」が代入された段階で、インスタンス2は「どこからも参照されなくなったインスタンス」となり、ガベージコレクションの対象となります。
一言まとめ
ガベージコレクションの対象は、「不要になったインスタンス」です。
コメント