Javaのメモリー構造とガベージコレクションについて
JavaVM
Java仮想マシン (Java virtual machine、Java VM、JVM) は、Javaバイトコードとして定義された命令セットを実行するスタック型の仮想マシン。APIやいくつかのツールとセットでJava実行環境 (JRE) としてリリースされている。この環境を移植することで、さまざまな環境でJavaのプログラムを実行することができる。
JavaVMのメモリー構造
JavaVMのメモリー構造は以下の要素で構成されている。
- Javaヒープ:アプリケーション・プログラムのオブジェクトを格納する領域。この領域は詳しく後で述べる。
- Permヒープ:クラスやメソッドなどのメタデータを格納する領域。
- Cヒープ:OSネイティブなメモリ領域。
- スレッドスタック:OSネイティブなメモリ領域。
Javaヒープ
Javaヒープ領域は大きくNewとOldという領域に分かれている。 NewはさらにEdenとSurvivor**という領域に分かれている。
Javaヒープでは、新しいオブジェクトはNewへ古いオブジェクトはOldに格納されている。具体的には、新しく生成されたオブジェクトはまず、NewのEdenに格納される。その後、ガベージコレクション(以下CG)という仕組みによって、オブジェクトは破棄されるか、SurvivorやOldに移行される。
ガベージコレクションの仕組み
GCとは、不要になったオブジェクトを自動的に破棄する仕組みである。この仕組が無いと、不要になったオブジェクトがメモリー上にずっと保持されたままになり、メモリー領域がなくなってしまう。
GCの処理の流れは以下の通りだ。
- 新しく生成されたオブジェクトはNew領域のEden領域に格納される。
- Eden領域がいっぱいになったら、Copy GCという機能が発生する。
- Copy CGとはNew領域を対象に、使用済みのオブジェクトは破棄される。またまだ必要なオブジェクトはSurvivor領域に移行される。
- 一定回数以上のCopy GC後、まだ使用され続けているオブジェクトはOld領域に移行される。
- Old領域がいっぱいになるとFull GCという機能が発生する。FullGCとは、Javaヒープ、Permヒープの全体を対象に不要となったメモリーを回収する。
このようにJavaVM内では効率よくメモリーが使われている。