Part1「今さら聞けないOSの疑問」,Part2「これがWindows Vistaだ!」,Part3 「Windows XP Tips 25 」に続いてPart4は,Javaなどで用いられている『仮想マシン』を解説します。

 Java技術が誕生したのは1995年。誕生してからすでに10年以上の歳月が流れました。登場当初はばく大なメモリーを消費するとか,とにかく遅いという理由で敬遠されがちでしたが,現在ではWebアプリケーションを中心に幅広く普及しています。遅いという欠点も徐々に克服していき,今では性能が重視されるバッチや組み込み系のアプリケーション,変わったところでは火星探査車両の制御にも利用されるようになりました。

 ここまでJavaが普及した大きな要因の一つに,一度作成したプログラムが多様なOSの上で動作するという点が挙げられます。この特徴を表す標語として「Write once, run anywhere」という言葉があります。ここで活躍するのがJava VM(Java Virtual Machine)です。どのようなOSであっても,Java VMさえインストールしておけば,その上で同じJavaプログラムが動作するのです。つまり,VMがOSの違いを吸収するのです。

 VMを利用しない言語では図1左のように,ハードウエアの差異はOSが吸収しますが,アプリケーションは各OSごとに開発する必要があります。一方,JavaではJava VMがハードウエアだけでなくOSの違いも吸収し,共通のインタフェースを提供します。アプリケーションはJava VMだけに合わせて開発すればよいので,マルチOSが実現できるというわけです。

図1●OSの機能を利用するプログラムと,VMを利用するプログラムの構造の違い。JavaではOSとプログラムの間にJava VMが入り,OSの違いを吸収している
図1●OSの機能を利用するプログラムと,VMを利用するプログラムの構造の違い。JavaではOSとプログラムの間にJava VMが入り,OSの違いを吸収している

 Java VMの仕様は米Sun Microsystemsによって決められており,この仕様を満たせば,独自にJava VMを作成することも可能です。例えば,米IBMや米BEA Systems(「JRockit」という名前でよく知られています)などが独自のJava VMを開発しています。この特集では,基本的なSun Microsystemsの実装を前提に説明していきます。

メモリー管理の手間からプログラマを解放

 CやC++といった言語では,プログラマが確保したメモリーは,不要になった時点でプログラマが責任を持って明示的に解放する必要があります。しかし,どんなに注意していても人間はミスをするものです。メモリー管理をプログラマの手にゆだねると,いつか必ずトラブルに見舞われることになります。プログラムが大きくなっていくとその可能性はどんどん高まります。安全でかつ長時間安定動作させる必要があるアプリケーションを開発しなければならないとき,メモリー管理は大きな問題となります。

 Java VMは,メモリー管理を自動化するガーベジ・コレクション(Garbage Collection:GC)という機構を備えてます。不要になったメモリー領域をVMが自動的に解放する機能です。プログラマが明示的にメモリー解放の処理を書く必要はありません。これにより,メモリー解放に関する人為的なミスが減少し,信頼性,安全性の高いアプリケーション開発ができるようになりました。

 ただし,GCにはオーバーヘッドがあることも事実です。プログラマが作ったプログラム以外に,メモリーを監視して,領域を整理するプログラムも動作するのですから当たり前です。特に,アプリケーションが大規模になってくると,GCの処理時間がスループットの低下やレスポンス・タイムの遅延を招くことがあります。何も知らずにただJavaのプログラムを書いているだけでは,GCが頻発して遅いプログラムができてしまうこともあります。GCによるメモリー管理の仕組みや挙動を把握すると,性能低下を極力抑えながら,大規模なアプリケーションを作ることも可能になります。

 そこで,GCの仕組みや挙動を解説します。ただしその前に,Java VMがプログラムを実行する仕組みやメモリーを管理する方法を知る必要があります。まずこれらの基本を解説してから,GCについて説明することにしましょう。