再起動は“トラブル予防の一環”
Javaプログラムは幅広い分野で活用されており、システム監視もその例外ではありません。そしてシステム監視業務においては、ルーチンワークとしてJavaで開発されたシステムのプロセス再起動が組み込まれていることがよくあります。しかし、なぜ定期的な再起動が必要なのでしょうか?
プロセスは必要に応じてメモリー領域を確保し、プログラムを実行します。これをメモリー空間と呼びますが、メモリー空間はプログラムの呼び出し元のアドレスなどを格納するための「スタック領域」と、自由に利用できる「ヒープ領域」に分けられます。ヒープ領域は、自由に利用できる反面、メモリー管理をプログラムで制御しなければなりません。メモリー管理がうまくいかないと、突然マシンがダウンしたり、プログラムがクラッシュするなど、障害が起こってしまいます。
しかし、メモリー管理はプログラミングとして難易度が高い。そこで考えられたのが「ガベージコレクション(GC)」です。GCはインタプリタ上に実装され、必要なくなったメモリー領域を自動で開放してくれます。Javaの場合は、JVM(Java Virtual Machine)に実装されています。
GCは文字通り、必要なくなったメモリー領域を定期的に“掃除”してくれるものです。さらに、GCはどこからも参照されなくなったメモリー領域を再配置し、常にメモリー空間を適切な状態に維持する機能も担っています。
非常に便利なGCですが、残念ながら「定期的にゴミ処理をしてくれるなら安心だ」ということにはなりません。ヒープ領域中のニュー領域では世代の新しいオブジェクトを格納するので、頻繁にGCが発生します。参照がないオブジェクトは破棄されますが、参照があるオブジェクトはヒープ領域に残り続けます。こうして生き残ったオブジェクトは、やがてヒープ領域中のオールド領域に移されていきます。オールド領域は空き容量が不足しないように大きく確保されているのが普通です。しかし、それでも空き容量は有限。いつかはなくなってしまいます。そうなってしまったら、システムは「FullGC」を行わなければなりません。FullGCを行っている間は、本来の処理を行っているスレッドはすべて止まり、対象となるメモリー領域はロックされます。つまり、システムの故障ではないのに、システムの処理が止まってしまうのです。しかも、どれぐらい時間がかかるかはメモリーの状況によってまちまちなので、システム運用においては最も避けたい状況の一つと言えます。
これを予防するには、FullGCが発生する前にシステムを再起動してメモリー空間をきれいな状態に戻すことです。任意のタイミングで再起動すれば、いつ終わるかわからないFullGCより、圧倒的な時間の短縮ができます。つまりプロセスの再起動は、トラブル予防の一環なのです。
統合運用管理ツールには、再起動ジョブを効率化する機能を備えたものがあります。また、障害発生時のサーバ再起動をジョブ管理に組み込めるものもあります。