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

時間よ、止まるな!――Javaにおけるメモリ管理という課題Cosminexus V8 Review

運用現場で悩みのタネになっているのが、突然発生するJavaアプリケーションの“Stop The World(一定時間応答のない状態)”である。解決の方法はあるのだろうか?

» 2008年10月20日 08時00分 公開
[友成文隆(日立製作所),ITmedia]

“Stop The World(一定時間応答のない状態)”はなぜ起こるか

 Javaのアプリケーションプログラムは、Cのプログラムなどと異なり、明示的に行っていたプログラムでのメモリの確保と解放を、Javaバーチャルマシン(Java VM)によって自動的に行う。しかしJava VMの特性から、メモリ管理で不可欠な「未使用メモリの再編成による連続した空きメモリの確保」に時間を要する。

 またこの処理によりすべてのプログラムを停止してしまうため、一定時間応答のない状態が続いてしまう。搭載メモリを増やすほどこの傾向は強まり、停止時間が10数秒におよぶことも珍しくない。

連続メモリ領域の確保

Java VMのメモリ管理方式は2段階

 ここではJava VMのメモリ管理方式について解説する。Java VMでは、メモリを2段階で管理する。このメモリ領域をヒープと呼ぶ。

 ヒープ領域はさらに2つに分かれている。一方は新しいメモリを確保する場合に用いられる領域でNew領域と呼ぶ。そしてもう一方がOld領域である。Old領域は、New領域で一定時間使われ続けるメモリを“追い出す先”となる。つまりNew領域の使われ続けるメモリをOld領域に再確保してから移動することで、New領域の空きを作るということになる。

2段階のメモリ管理方式

 メモリを確保する単位をインスタンスと呼ぶ。New領域に確保する「短い時間でプログラムが開放する短寿命インスタンス」とOld領域に移動対象となる「長い時間、開放されない長寿命インスタンス」がある。

メモリの再編成は2段階で実行

 上述のように2つのメモリが目的に応じて用意されているが、メモリの確保と開放を繰り返し行うと、いわゆる“歯抜け”のメモリ領域が生じてしまう。メモリはあるのだが、連続した領域ではないため、プログラムが確保したいと判断するサイズに満たない“断片”である。この断片をまとめ、新たな連続した空き領域を作る操作のことをガベージコレクション(GC)と呼ぶ。ガベージコレクションを行うには、メモリを使用しているプログラムとの間で、ポインタ関係を再構築する必要がある。そのため、すべての実行中のプログラム(スレッド)を停止しなければならない。このGCは、New領域でもOld領域でも行われる。各領域のGCを、それぞれCopy GCおよびFull GCと呼ぶ。

業務スケジュールに関係なく実行されてしまうGC

 ガベージコレクションは、必要な空き領域が不足したときに実行される。短寿命インスタンスの管理を行うNew領域はサイズも小さく、移動もコピーで行われ、張り替えるポインタも少ないため、非常に短時間で処理される。このためWebシステムの利用者には、業務が停止するような現象として認識されることはない。

 一方、Old領域はメモリサイズが大きく、また断片化したメモリも再配置されるため、10数秒にわたりプログラムが停止することがある。しかも、トランザクションのピーク時に停止することが多く、Webシステムがダウンしたかのように見えるため、運用現場の課題となっていた。

“Stop The World”を避けるために

 この課題を解決するには、Full GCを起こさないようにするのが、1つの策となる。Cosminexus V8はここに着目し、Old領域で使われ続けるインスタンスを別管理することで、Full GCの抑制を図った。

 V8で実装したのは、別メモリ空間に「確保と開放のタイミングが分かっているメモリ(毎回GCする必要のないメモリ)」を管理する、という技術である。これは、アプリケーションサーバとJava VMを日立が自製しているため実現できたものである。

Full GCの抑制

次回:

今回は、Java VMにおけるメモリ管理方式と、運用現場を悩ませるjavaアプリケーションの“Stop The World(一定時間応答のない状態)”の原理について説明した。軽く触れたFull GCを防止する技術については、次回詳細を解説する。


Copyright © ITmedia, Inc. All Rights Reserved.

注目のテーマ