Webシステムの停止をもたらすFull GCを防ぐ手法、それは「長時間使うインスタンス専用の特別な管理領域を持つ」というものである。
Javaには、メモリの解放を自動で行ってくれる、ガベージコレクション(GC)という便利な機能がある。しかし注意しないと、メモリ領域の再編成に必要なFull GCが頻繁に発生してしまい、業務実行が一時的に停止してしまう。この停止が長い時間におよぶと、Webシステム利用者にはシステムがダウンしたように見えてしまう。
前回は業務実行が一時的に停止してしまう仕組みを説明し、またCosminexus V8では、その解決策となる機能が実装されているところまで紹介した。今回は、その一時停止の原因となるFull GCをどのように解決しているかについて解説する。
既に解説したとおり、Full GCの発生は、長時間使うインスタンスがOld領域に移動し続けるため、その領域をGCする必要があることに原因が求められる。このため、長時間使うインスタンスを生成させなければ、Full GCの発生を根本的に防止できる。しかし、長時間使うインスタンスが必要であれば、防ぎようがない。
そこで、Cosminexusにおいて採られたのは「長時間使うインスタンス専用の特別な管理領域を持つ」という回避策である。
この「特別な管理領域」をFull GCの発生原因となるOld領域から切り離せば、Old領域のインスタンス増加を防げる。そして特別な管理領域については、アプリケーションサーバの内部でインスタンスの生成と削除を行ってしまえば、Full GCを発生させずにインスタンスを削除できる。
ほかにも工夫されている点がある。それはアプリケーションサーバとJava VMが連携しているということだ。例えば、アプリケーションサーバのクライアントから行う「ログインからログアウトまでの1つのセッション」の管理情報は、長時間使うインスタンスになりやすい。そこでCosminexusでは、このセッション管理情報を特別な管理領域に格納することにした。
これにより業務アプリケーションは、特別な管理領域を全く意識する必要がなくなる。もちろん業務アプリケーションの変更も不要である。そのため、ほかのアプリケーションサーバで動作していた業務アプリケーションからも、スムーズに移行できる。
最後に、セッションを使用するオンラインバンク業務のシステムで検証した結果を紹介する。今までFull GCが日中1時間に1回の割合で発生していたケースにおいて、適用後には30日連続稼働してもシステム停止が発生しなくなった。もちろん業務アプリケーションに変更は加えていない。従来のアプリケーションがそのまま利用できたことが証明された。
従来システムでは日中1時間ごとにメモリを100%消費していたのに対し、Cosminexus V8に変更後,安定して稼働するようになった。次回は、アプリケーションの安定稼働を可能にする、業務の多重度制御や障害の局所化について解説したい。
Copyright © ITmedia, Inc. All Rights Reserved.