企業IT最適化のゴールを目指す

JavaVMのメモリ管理をマスターするJava Review(1/2 ページ)

Webシステムの安定動作には、メモリ使用量の適切な見積もりが不可欠。だがJavaVMでメモリがどのように管理されるかを理解しているだろうか? メモリに関する問題が発生すると、知識や技術資料の不足によって問題が長期化しがち。JavaVMでどのようにメモリが管理されているかを理解し、正確なメモリサイジングやメモリ関係のトラブルの早期解決へとつなげよう。

» 2009年05月27日 08時00分 公開

この記事は会員限定です。会員登録すると全てご覧いただけます。

JavaVMのメモリ構造を理解しよう

 まず、JavaVMがどのようにメモリを使っているかを理解しておこう。JavaVMがプログラムを実行すると、Javaのプロセスによってメモリが使用される。Javaのプロセスでは、Javaヒープ、Permヒープ、Cヒープ、およびスレッドスタックという4つのメモリ領域を使用する。

 Javaヒープはアプリケーションプログラムの各種オブジェクトを格納する領域であり、Classのnewで確保される。JavaヒープはNew領域とOld領域に分けられ、New領域はさらにEden、Survivor(from、to)から構成される。これらは後ほど説明するガベージコレクション(GC)で世代ごとの領域として利用される。Edenが生成されたばかりのオブジェクト、Survivorがある程度の間使用されているオブジェクト、Oldが長期間使用されたオブジェクトを格納する領域である。

 Javaヒープ以外の領域では、Permヒープはクラスやメソッドなどのメタデータを格納する領域、CヒープはOSネイティブなメモリ領域、スレッドスタックはJavaのアプリケーションが利用するJavaスレッドのスタック領域である(図1)。

図1 図1

 これらの各種メモリ領域のサイズは、JavaVM起動時のオプションで指定することができる。JavaVMのメモリ空間のサイズや割合などを指定する、主な起動時オプションを表に示す。

オプション名 オプションの意味
-Xmx Javaヒープの最大サイズを設定。単位はバイト
-Xms Javaヒープの初期サイズを設定。単位はバイト
-XX:MaxPermSize Permヒープの最大サイズを設定。単位はバイト
-XX:PermSize Permヒープの初期サイズを設定。単位はバイト
-Xmn New領域の初期値および最大値を設定。単位はバイト
-Xss 1スタック領域の最大サイズを設定。単位はバイト
-XX:NewRatio New領域に対する Old領域の割合を設定。2を設定した場合は、New領域とOld領域の割合が、1:2になる

 これらのオプションを用いて、メモリサイズを適切に設定する必要がある。メモリの不足はjava.lang.OutOfMemoryErrorが発生してシステムが不安定になったり、GCの多発による性能上の問題につながったりするため注意が必要だ。

GCの仕組み

 JavaVMのメモリ管理の理解に必須となるGCについても復習しておこう。Javaでは、アプリケーションプログラムで使用済みメモリを明示的に削除する必要はない。不要になったメモリは、JavaVMによって自動的に回収されるからだ。プログラムの処理が進むと、JavaVMのメモリ空間(主にJavaヒープ)は使用済みと使用中の領域が混在し、使用できるメモリ領域が減っていく。そこで、メモリ領域が不足すると、JavaVMは使用済みの不要なメモリ領域を回収する。これがGCである。(図2)

図2 図2

 ここで、GCの仕組みについて説明する。Java VMでは、Javaヒープ領域をNew領域とOld領域に分けて管理することが多い。これは、生成したオブジェクトの大半は短時間で使用済みオブジェクトになるからだ。GCもこのオブジェクトの世代を意識して行われる。


  • 新しく生成されたオブジェクトは、New領域のEden領域に配置される。New領域のEden領域がいっぱいになり、メモリが足りなくなるとCopy GCが発生する。
  • Copy GCはNew領域を対象として行う。Eden領域やSurvivor領域の使用済みオブジェクトは破棄の対象となる。生き残ったオブジェクトは空いている側のSurvivor領域に移動する(図3)。
  • 一定回数以上のCopy GCを超えて使用され続けているNew領域のオブジェクトはOld領域に移動する。つまり、使用時間が長いオブジェクトはOld領域に移ることになる(図4)。
  • Old領域がいっぱいになるとFull GCが発生する。Full GCではJavaヒープ、Permヒープの全体を対象として使用済みのメモリを回収する。
図3=左、図4=右
       1|2 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

注目のテーマ