Java仮想マシンの仮想化機能: Multi-Tasking

首藤 一幸

注: このページの文章は Software Design 誌 2004年 9月号に掲載された以下の記事の元原稿です。 Software Design 誌編集部の了承の元に、本ウェブページに掲載しております。
首藤一幸, "Java仮想マシンの仮想化機能: マルチタスキング", Software Design 2004年 9月号, p.22, (株)技術評論社, 2004年 8月 18日

Java仮想マシン(JVM)は,主にソフトウェアで実装される仮想の計算機です. JavaのアプリケーションはJVMによって実行され,そのJVMを専有します. 1台のマシン上で2つ以上のJavaアプリケーションを同時に実行したい場合は どうするでしょうか? それぞれのアプリケーションを,個別に,javaコマンドで起動するわけです. こうすると,javaコマンドごとに個別のJVMが,それぞれのプロセス上で動作します.

この場合,OSが提供する計算機仮想化機能であるところのプロセスを利用して, 1台のマシン上で複数のJavaアプリケーションを動作させています. OSのプロセス管理機構は, メモリ上の共有ライブラリ(またはDLL)をプロセス間で共有できるなど, 資源を節約するための機能も備えていますし, Java以外にもごく頻繁に使われる機構なので実装が成熟していることも期待できます. しかし,プロセス管理機構は,複数のJavaアプリケーションの並行実行を 充分にサポートできているとは言えません. 例えば,コンパイル済みのネイティブアプリケーションであれば,今時, メモリ上にロードされた標準ライブラリ(UNIX系OSのlibcなど)は 複数のプロセス間で共有されることが一般的です. これによってメモリの無駄な消費を防いでいます. ところが,JavaのクラスライブラリはOSから見ればただのデータなので, プロセス間で共有されません(*). また,携帯電話機など, 資源が限られていて複数プロセスの並行実行が許されないような組み込み用途に, Javaが普及してきています.


図1: Multi-tasking

そこで,単一のプロセス上で複数のJavaアプリケーションを 効率よく並行動作させる,multi-taskingと呼ばれる仕掛け(図1)が開発されています. ひとつは,Sun Labsで研究されているMulti-tasking VM(MVM)です. これは,PCからハイエンドサーバまでを対象としたJVMである HotSpot VMを元に,複数アプリケーションをホストする機能を追加したものです. もうひとつは,携帯電話機程度の環境を対象としたJVMである CLDC HotSpot Implementation(CLDC HI)の次期バージョンです.

どちらも,単一プロセス上での, 複数Javaアプリケーションの同時実行を可能とします. 2004年6〜7月に開催されたJava開発者会議JavaOneでは, シャープ製PDA Zaurusや,そのまた上で動作する携帯電話機エミュレータ上で CLDC HIを動作させ,音楽再生アプリケーションと同時に 画面描画アプリケーションを動作させるというデモがありました.

multi-tasking対応JVMでは,複数のJavaアプリケーションが, ランタイム,ロードされたコード,JITコンパイル結果のネイティブコードを 共有します. 共有することによって,これらが消費するメモリ,コードのロード,リンク, JITコンパイルに要する時間を節約できます. 時間については,特に,アプリケーションの起動時間が短縮されます. 効果の大きさはアプリケーションの性質に依りますが, あるサーバアプリケーションを5つ動作させた場合に, HotSpot VMが110MB以上を消費していたところ, MVMでは50MBのメモリ消費量であったと報告されています. また,起動に7秒以上かかるアプリケーションも, MVM上での2つ目以降の起動は2秒以下で済んだそうです.

2004年秋に正式版がリリースされる予定のJava 2 Standard Edition 5.0では, 単一プロセス上での複数アプリケーション実行こそ実装されていませんが, JVM間でのコード共有機能Class Data Sharingが用意されます. メモリ消費量の削減が期待できます. MVMのようにより進んだ共有機能も,今後実装されていくことでしょう.

(*)GCJなどのAOTコンパイラでは事情は別.