JVMガベージコレクションの仕組み
Java仮想マシン(JVM)のガベージコレクション機構は、メモリを自動管理する機構であり、プログラムで使用されなくなったオブジェクトを認識して解放することで、メモリのリークやメモリオーバーフローなどの問題を防ぎます。
ガベージコレクション機構を利用する際に考慮すべき原則
- 参照カウント:JVMは参照カウントを用いてオブジェクトが参照されている回数を追跡します。オブジェクトが参照されるたびにその参照カウンタは1増加し、参照が無効になるとカウンタは1減少します。参照カウンタが0になると、JVMはそのオブジェクトが不要になったと判断し、ガベージコレクションによって解放されます。
- リーチャビリティ解析:JVMはリーチャビリティ解析を使って、オブジェクトがプログラムからアクセス可能であるかどうかを判定しています。一連の「GC ルート」と呼ばれるオブジェクトから開始し、オブジェクト参照チェーンをたどってオブジェクトがリーチャブル(アクセス可能)かどうかを判断しています。オブジェクトがリーチャブルではない(つまり、オブジェクトに到達する参照がない)場合、JVMはオブジェクトをガベージとしてマークします。
- マークアンドスイープ法: JVMがガベージオブジェクトを特定すると、マークアンドスイープ法を使ってガベージコレクションを実行する。このアルゴリズムは、マーキングフェーズとスイーピングフェーズの 2 つのフェーズに分かれている。マーキングフェーズでは、JVM は到達可能なすべてのオブジェクトをマークし、それらを生存オブジェクトとしてマークする。スイーピングフェーズでは、JVM はマークされていないすべてのオブジェクトを消去し、それらが占有していたメモリー領域を回収する。
- ガベージコレクション後にJVMでメモリのフラグメンテーションが発生する可能性があります。このフラグメンテーションに対処するために、JVMはメモリのコンパクションアルゴリズムを使用して、空き領域を確保します。このアルゴリズムは、アクティブなオブジェクトをメモリの一方の端に移し、反対側に連続した空き領域を作成します。
JVM のガベージコレクションメカニズムにより、前述の原則に基づいて自動的にメモリを管理し、プログラマはメモリの解放を手動で行うことなくコーディングに集中できる。