オブジェクトの動的バージョン管理機能を持つ Java 仮想マシンの試作 A

社団法人 ஢子情報通信学会
THE INSTITUTE OF ELECTRONICS,
INFORMATION AND COMMUNICATION ENGINEERS
信学技報
TECHNICAL REPORT OF IEICE
オブジェクトの動的バージョン管理機能を持つ Java 仮想マシンのࠟ作
倉持 傑
杉山 安洋
日本大学大学院工学研究科 〒963-8642 福島県郡山市田村町徳定字中河原 1
日本大学工学൉ 〒963-8642 福島県郡山市田村町徳定字中河原 1
E-mail:
[email protected]
[email protected]
あらまし 実行中のソフトウェアを停止する事なく,機能のୈ加や変更を可能にするため,我々の研究室では,
オブジェクトの動的バージョン管理機能について研究してきた.今回この動的バージョン管理機能を持った Java
仮想マシンをࠟ作した.本稿では,その概要と通常の Java 仮想マシンとの実行速度等の比Ԕを行う.
キーワード バージョン管理,オブジェクト,Java 仮想マシン
A Prototype of the Java Virtual Machine
with the Dynamic Version Management Mechanism for Objects
Suguru KURAMOCHI
Yasuhiro SUGIYAMA
Graduate School of Engineering, Nihon University
Koriyama, Fukushima, 963-8642 Japan
Department of Computer Science, College of Engineering, Nihon University
E-mail:
[email protected]
Koriyama, Fukushima, 963-8642 Japan
[email protected]
Abstract We are developing a mechanism that allows software engineers to add and change the functionality of running
software systems without stopping their execution. We developed a prototype of the Java virtual machine that includes the
dynamic version management mechanism for objects. This paper will give a brief overview and the performance evaluation of
the prototype system.
Keyword version management,objects,Java virtual machine
1. は じ め に
ことが多い.‫ؿ‬行のオンラインシステムや各種のサー
ソフトウェアの開発作業においては,バグの修正
バシステムなどがその例である.しかし,ソフトウェ
や機能のୈ加・変更などの理由により,多くのバージ
アシステムの機能ୈ加や不良の修正のためのバージョ
ョンのソースファイルが作成される.ソフトウェアの
ンの入れ替え作業は,ソフトウェアを停止させて行わ
リリース後も新しいバージョンをリリースするため開
れているのが現状である.そのようなバージョンの更
発は継続され,バージョンごとにソースファイルは増
新作業はソフトウェアを停止させないで行えることが
え続けることとなる.しかし,多くのバージョンのソ
望ましい.
ースファイルを管理することは容易ではない.そのた
我々の研究室では,ソフトウェアの実行中に,ソ
め,ソースファイルのバージョン管理については古く
フトウェア中のオブジェクトのバージョンを入れ替え
から研究されており,数多くのバージョン管理用ツー
ることにより,ソフトウェアの機能変更やバグ修正を
ル が 開 発 さ れ て き た . そ の 代 表 と し て RCS[1] や
行うための,オブジェクトの動的バージョン管理機能
SCCS[2]な ど の ツ ー ル が 挙 げ ら れ る . こ れ ら の ツ ー ル
[3]に つ い て 研 究 し て き た . そ れ を Java ۗ ‫ ܃‬で 書 か れ
は,ソースファイル単位でバージョン管理を行うもの
た シ ス テ ム に 対 し て 実 現 す る た め の シ ス テ ム [4]が 開
であり,バージョン履歴の保存,ディスクスペースの
発されている.
節約,ソースファイル編集時の排他制御などの機能を
しかし,これまでの研究では,動的バージョン管
持 っ て い る .し か し ,バ ー ジ ョ ン 管 理 が 必 要 な も の は ,
理 シ ス テ ム 自 身 が Java ۗ ‫ ܃‬に よ り 実 装 さ れ て お り ,
ソースファイルのみではない.
実行効率に問題があった.我々は,現在,この問題を
‫ؼ‬年,ソフトウエアシステムは人間の生活に深く
ӕ決するべく,動的バージョン管理の機能を持った
浸透している.それらのシステムの停止は,例え一時
Java 仮 想 マ シ ン の 開 発 を 行 っ て い る . 本 論 文 で は ,
的なものであっても,人間生活に大きな影‫؜‬を与える
現在までに開発された動的バージョン管理機能を持つ
Java 仮 想 マ シ ン の 概 要 と , そ の 評 価 に つ い て 述 べ る .
2. 動 的 バ ー ジ ョ ン 管 理 の 概 要
Java ۗ ‫ ܃‬の よ う な オ ブ ジ ェ ク ト 指 向 の ۗ ‫ ܃‬で 開 発
2.1.2. バ ー ジ ョ ン 切 り 替 え 機 能
されたソフトウェアの機能を変更するためには,その
バージョン切り替え機能は,バージョン指定情報
中で使用されているオブジェクトに変更を加える必要
を元にアクセスするバージョンを切り替える機能であ
がある.しかも,ソフトウェアを停止させないで機能
る.その際,指定されたバージョンが存在しない場合
変更するためには,オブジェクトへの変更を実行中に
は,上記の新バージョンの生成機能を使いそのバージ
行う必要がある.我々の研究室ではオブジェクトの動
ョンを生成した後にそのバージョンへアクセスする.
的バージョン管理機能によりこれを実現している.こ
れは使用中のオブジェクト自身に変更を加えるのでは
2.2. バ ー ジ ョ ン の 作 成 法
なく,オブジェクトに機能の異なる複数のバージョン
また,新しいバージョンを定義する際には,全く
が存在することを可能とし,それらのオブジェクトを
新֩に定義する必要はなく,古いバージョンからの変
実行中に切り替えて使用することを可能とするメカニ
更൉分を定義するのみで良い.
ズムである.
新しいバージョンに対して,古いバージョンのメ
ソッドの実行要求やインスタンス変数のアクセス要求
2.1. 代 理 オ ブ ジ ェ ク ト
があった場合には,その要求が古いバージョンに対し
動的バージョン管理システムでは,複数のバージ
て 転 送 (delegation)さ れ る こ と に よ り 処 理 さ れ る .
ョンを持つオブジェクトが,バージョン管理されてい
ることを意ࡀすることなく,一般のオブジェクトと同
3. 動 的 バ ー ジ ョ ン 管 理 の 問 題 点
様にプログラム中で使用することができるように,代
動的バージョン管理では,上述した通り代理オブ
理オブジェクトを使用する.図 1 に示すように,ユー
ジェクトを介しての間接的なアクセスを頻繁に行うこ
ザプログラムと使用するオブジェクトとの間に代理オ
ととなり,通常のオブジェクトに対するアクセスに比
ブジェクトを置く.ユーザプログラムは代理オブジェ
べて実行効率が悪い.また,新バージョンを生成する
クトをオブジェクト自身であると思ってアクセスする.
作業は決して速いものではない.さらに,新バージョ
代理オブジェクトは,ユーザプログラムからの処理依
ンが再利用している旧バージョンのメソッドを要求さ
頼を受け取り,バージョン指定情報を元に使用するオ
れた場合,旧バージョンを順に調べそのメソッドが存
ブジェクトのバージョンを選択する.そして,指定さ
在する最も新しいバージョンを探す作業なども発生し,
れたバージョンのオブジェクトに処理を依頼し,その
こ の 作 業 も 速 い も の で は な い . こ れ は , Java ۗ ‫ ܃‬に
結果をユーザプログラムにඉす.代理オブジェクトの
は も と も と 存 在 し な い delegation の 機 能 を 代 理 オ ブ ジ
機能は,新バージョンの生成とバージョン切り替え機
ェクトの機能として実装しているためである.
能の 2 つからなる.
代理オブジェクトの動作速度を向上させるために
は,上記の一つ一つの処理の速度向上が必要である.
バージョン指定情報
しかし,代理オブジェクトの実装を改良しても動作速
度を大幅に向上させることはできない可能性が‫ݗ‬い.
これは,代理オブジェクトの機能の多くが,リフレク
ユーザ
代理
プログラム
オブジェクト
ションを使用する必要があるためである.そのため,
オ ブ ジ ェ ク ト の 動 的 バ ー ジ ョ ン 管 理 機 能 自 身 を Java
仮 想 マ シ ン [5]に 組 込 む こ と で , シ ス テ ム 全 体 の 実 行
選択
効率を上げることにした.
バージョン 1
バージョン 0
要求転送
4. Java 仮 想 マ シ ン の 概 要
Java 仮 想 マ シ ン に は 図 2 に 示 す よ う に 実 行 中 に 生
図 1 代 理 オ ブ ジ ェ ク ト
成されたオブジェクトを格納するヒープ領域が存在す
る.また,実行時コンスタントプールと呼ばれるデー
2.1.1. 新 バ ー ジ ョ ン の 生 成 機 能
新バージョンの生成とは,バージョン指定情報に
タや,メソッド情報,フィールド情報用の領域も存在
する.
より選択されたバージョンが生成されていない場合
Java 仮 想 マ シ ン の 構 造 は , 基 本 的 に は ス タ ッ ク マ
(例えば,そのバージョンに対する初回アクセス時)
シンであり,変数の値や一時的な‫ڐ‬算結果などをスタ
にそのバージョンを自動的に生成する機能である.
ックに格納して処理を行う.実行中のスレッドに着目
した場合,そのバイトコードを実行するためにオペラ
タグ 7 でクラスを示しており,さらにインデックス 3
ンドスタックとローカル変数が存在する.バイトコー
のエントリを参照するようになっている.インデック
ドの種་により,これらのどの領域に影‫؜‬を及ぼすか
ス 3 のエントリは,タグ 1 で文字列が格納されている
が決まる.
ことを示している.インデックス 4 のエントリは名前
と型を示しており,その中でインデックス 5 と 6 を参
実 行 時 コンスタ
メソッド
フィールド
ヒープ
ントプール
情報
情報
領域
スレッド 2
スレッド 1
スレッド n
オペランド
オペランド
オペランド
スタック
スタック
スタック
ローカル
ローカル
変数
変数
.
.
.
.
.
照するようになっている.インデックス 5 と 6 は,と
もに文字列が格納されている.インデックス 6 のエン
トリは引数,戻り値が空であることを表している.
このようにたどっていくと,インデックス 1 のエ
ン ト リ は Hello ク ラ ス の メ ソ ッ ド void sayHello()を 示
しているということになる.
同 様 に し て , イ ン デ ッ ク ス 7 の エ ン ト リ は Hello ク
ローカル
ラ ス の 名 前 が <init>, 引 数 と 戻 り 値 が void の メ ソ ッ ド
変数
を 示 し て い る が , イ ン デ ッ ク ス 9 の 示 す <init>は 特 殊
図 2 Java 仮 想 マ シ ン の 構 造
な表記でありコンストラクタを示すものである.つま
り , Hello()と い う コ ン ス ト ラ ク タ を イ ン デ ッ ク ス 7 は
示しているということになる.
4.1. 実 行 時 コ ン ス タ ン ト プ ー ル
実行時コンスタントプールは,定数やクラス名な
どを保持するための構造体であり,可変ସの配列とな
っている.参照の際には,インデックスを指定する.
コンスタントプールは,もともとクラスファイル
中に存在し,クラスをロードした時点で実行時コンス
タントプールとして仮想マシン上にロードされる.
実際のエントリは図 3 のようになっている.
4.2. 仮 想 マ シ ン の 実 行 例
index 1
a
2
4
index 4
c
5
index 2
index 3
7
1
6
3
9
Hello
1
明する.
hello = new Hello( );
8
sayHello
hello.sayHello( );
index 7
( )V
index 8
c
下記のソースコードの一൉を例とし,実行例を説
5
index 5
index 6
1
3
a
2
このソースコードをコンパイルすると,次のよう
8
なバイトコードが生成される.
index 9
6
1
6
<init>
1:new #2 <Class Hello >
2:dup
図 3 コ ン ス タ ン ト プ ー ル
3:invokespecial #7 <Method Hello( ) >
エントリの最初の 1 バイトは常にタグとなってお
4:putfield #10 < Field Hello hello >
り ,そ の エ ン ト リ が 示 す 情 報 を ࡀ 別 す る た め に 用 い る .
5:getfield #10 < Field Hello hello >
このタグの種་の例を表 1 に示す.
6:invokevirtual #1 <Method void sayHello()>
表 1 コ ン ス タ ン ト プ ー ル の タ グ
これはコンパイラにより生成されたバイトコード
を , javap コ マ ン ド で 見 や す い 形 で 表 示 し た も の で あ
定数の型
CONSTANT_Class
CONSTANT_Methodref
CONSTANT_NameAndType
値
7
a
c
CONSTANT_Utf8
1
意味
クラス
メソッド
名前,引数
戻り値
文字列
る . Javap コ マ ン ド は JDK に 含 ま れ る コ マ ン ド で ク ラ
スファイルに含まれる情報を表示することができるツ
ー ル で あ る . オ ペ コ ー ド の 後 の #の つ い た 数 字 は 実 行
時コンスタントプールへのインデックスであり,その
オ ペ コ ー ド の 引 数 で あ る . そ の 後 の < >の ൉ 分 は そ の
インデックスが指す実行時コンスタントプールの情報
図 3 のインデックス 1 のエントリは,タグが a とな
っていることからメソッドに関する情報を示すことが
わかり,その中でさらに,インデックス 2 と 4 を参照
するようになっている.インデックス 2 のエントリは
で あ り , javap の つ け た コ メ ン ト で あ る .
バイトコードとヒープ領域,オペランドスタック
の関係を図4を用いて説明する.
ースコードを理ӕしやすいインタプリタを選択した.
Kaffe を 改 造 し た 仮 想 マ シ ン を kaffe/DVM と 呼 ぶ .
hello の参照
代 理 オ ブ ジ ェ ク ト 相 当 機 能 を Kaffe/DVM に 組 み 込
hello の参照
hello の参照
むためには,新バージョンの生成機能と,バージョン
1 行目
2 行目
切り替え機能を実装する必要があるが,今回のࠟ作で
は,バージョン切り替え機能のみを実装した.プログ
hello の参照
3 行目
4 行目
hello の参照
6 行目
5 行目
図 4 ス タ ッ ク の 状 態
ラム中で使用するオブジェクトのバージョンを実行時
に生成することはできないが,それらのバージョンを
予め生成しておき,それらを実行時に切り替えて使用
することができる.なお,バージョンの生成機能は,
仮 想 マ シ ン の 外 ൉ で , Java ۗ ‫ ܃‬の ソ ー ス コ ー ド レ ベ
ルで行っている.
1 行 目 の new で は , Hello ク ラ ス の イ ン ス タ ン ス を
ヒープ領域に生成し,その参照をオペランドスタック
に push し て い る .
ユーザ
version 0
プログラム
version 1
2 行 目 の dup で は , 1 行 目 で オ ペ ラ ン ド ス タ ッ ク に
格 納 さ れ た 値 を コ ピ ー し ,オ ペ ラ ン ド ス タ ッ ク に push
する.つまり,オペランドスタックに同じ参照が 2 つ
代理オブジェクト相当機能
存在する状態となる.
3 行 目 の invokespecial で は , Hello ク ラ ス の コ ン ス
Java 仮想マシン
図 5 JVM / DVM
トラクタを呼び出している.この際,オペランドスタ
ッ ク の 値 を pop す る . こ の 場 合 は オ ペ ラ ン ド ス タ ッ ク
仮想マシン内൉でバージョン切り替え機能を実現
中 の Hello ク ラ ス の イ ン ス タ ン ス の 参 照 を pop す る こ
するためには,アクセス先オブジェクトを動的に変更
ととなる.
する必要がある.メソッド呼び出しのバイトコードで
4 行 目 は 変 数 hello に オ ペ ラ ン ド ス タ ッ ク か ら pop
あ る invokevirtual が 実 行 さ れ る 際 に は , 4.2 節 で 述 べ
した値を格納する.この場合はオペランドスタック中
た通り,オペランドスタックよりオブジェクトの参照
の Hello ク ラ ス の イ ン ス タ ン ス へ の 参 照 が 変 数 hello
を 得 る . 4.2 節 の 例 で は , getfield に よ っ て イ ン ス タ ン
に格納されることとなる.
ス変数中に格納されたオブジェクトの参照を得ている.
5 行 目 で は , 変 数 hello の 値 を オ ペ ラ ン ド ス タ ッ ク
そ の た め , getfield を 実 行 す る 際 , そ の 変 数 が バ ー
に push し て い る . 変 数 hello に は Hello ク ラ ス の イ ン
ジョン管理の対象であるか否かを判定し,対象であっ
スタンスへの参照が格納されているので,それがオペ
た場合には,現在使用するべきバージョンのオブジェ
ラ ン ド ス タ ッ ク へ push さ れ る .
ク ト の 参 照 を オ ペ ラ ン ド ス タ ッ ク に push す る 事 で ,
6 行 目 で は , オ ペ ラ ン ド ス タ ッ ク か ら Hello ク ラ ス
invokevirtual に よ る メ ソ ッ ド 呼 び 出 し が 切 り 替 え ら れ
の イ ン ス タ ン ス の 参 照 を pop し , そ の オ ブ ジ ェ ク ト の
る事となり,バージョン切り替え機能を実現する事が
sayHello と い う メ ソ ッ ド を 実 行 し て い る .
できる.
な お , getfield 以 外 に も aload, getstatic 等 オ ペ ラ ン
5. 仮 想 マ シ ン で の 代 理 オ ブ ジ ェ ク ト 機 能 の 実
ドスタックにオブジェクトの参照を格納する命令は存
現
在 す る た め , そ れ ぞ れ の バ イ ト コ ー ド で getfield と 同
動的バージョン管理機能を組み込んだ仮想マシン
様の処理を行う必要がある.
JVM/DVM (Java Virtual Machine / Dynamic Version
Management)は , 図 5 の よ う に 既 存 シ ス テ ム で の 代 理
6. Kaffe/DVM の ࠟ 作
オブジェクト相当の機能を持たせることで実現する.
6.1. kaffe の 構 成
今 回 の 開 発 に 用 い て い る Java 仮 想 マ シ ン は Kaffe [6]
仮 想 マ シ ン kaffe は , kaffe, kaffevm , kaffevm/intrp
で あ る . こ れ は , オ ー プ ン ソ ー ス の Java 仮 想 マ シ ン
等 の モ ジ ュ ー ル か ら 構 成 さ れ て い る .モ ジ ュ ー ル kaffe
である.オープンソースなので情報が多く,開発を比
は , kaffe コ マ ン ド に 直 結 す る 処 理 を 行 う も の で , オ
Ԕ的容易に行えると考えたためこの仮想マシンを採用
プ シ ョ ン の 判 別 や , Kaffe の バ ー ジ ョ ン 情 報 の 出 力 な
し た . Kaffe の 仮 想 マ シ ン に は イ ン タ プ リ タ 版 と JIT
ど を 担 当 す る . こ の 中 の main 関 数 で 仮 想 マ シ ン を 実
版 が あ る . 今 回 は , 動 作 速 度 は JIT に 比 べ て ૺ い が ソ
際に開始するモジュールを呼び出している.
モ ジ ュ ー ル kaffevm/intrp は , Java 仮 想 マ シ ン の 実
ファイルを元に行う.この指定情報ファイルは,例え
装 で あ り intrp は , イ ン タ プ リ タ を 表 し て い る . 今 回
ば A クラスのバージョン 1 で稼働させる場合は A = 1
は,インタプリタを選択したのでこれを使うが,他に
のように記述したテキストファイルである.
kaffe/jit が 存 在 す る . kaffevm/intrp の 中 の , machine
ハッシュテーブル更新のタイミングは,バージョ
関数によって実際の仮想マシンの動作を行う.上記の
ン指定情報ファイルを変更した後にユーザにより仮想
main 関 数 に よ っ て , こ の 関 数 machine が 呼 ば れ る .
マシンに対してシグナルを送る形とした.このシグナ
関 数 machine は , 基 本 的 に は ル ー プ し て バ イ ト コ ー ド
ルが送られるまでは,ハッシュテーブルの更新が行わ
をひとつずつ実行する.そのループの中で,バイトコ
れないため,バージョンも切り替わることはない.シ
ードごとに分岐し,それぞれを実行する形になってい
グナルが送られる以外に,仮想マシンの֬動時にもハ
る.
ッシュテーブルの更新は行われる.
kaffevm の 中 の kaffe.def が そ の バ イ ト コ ー ド ご と の
上述のように,バージョン指定情報ファイルを元
処 理 を 担 当 す る . つ ま り , kaffe.def に は , バ イ ト コ ー
にハッシュテーブルを作成し,そのハッシュテーブル
ドの処理がすべて定義されているのである.
を 用 い て , getfield の 引 数 を 変 更 す る こ と が 可 能 と な
った.これによって,インスタンス変数に格納された
バージョン管理対象のオブジェクトのバージョンを切
6.2. kaffe へ の 変 更
今回の実装では,バージョン管理されたオブジェ
り替えて使用できるようになった.
クトの各バージョンの参照は,それぞれ別のインスタ
ン ス 変 数 へ 格 納 す る 方 式 と し た . getfield の 引 数 は ,
6.3. 比 Ԕ 検 証 用 サ ン プ ル
その変数の名前やクラス名等の情報にリンクされたイ
今 回 開 発 し た Kaffe/DVM の 実 行 効 率 を 検 証 す る た
ンデックスである.このインデックスを必要なバージ
め,次のようなサンプルプログラムを用意した.基本
ョンを格納する変数を表すインデックスと交換するこ
構成は,A クラスをバージョン管理対象とし,B クラ
とで,オペランドスタックには切り替え後のバージョ
スの中で A クラスのインスタンスを生成し,そのメ
ンの参照が格納されることとなる.
ソ ッ ド を 100 回 , 150 回 , 200 回 呼 び 出 す と い う も の
kaffe
kaffevm
で あ る . 対 象 の メ ソ ッ ド は , System.out.println に よ る
クラス名
バージョン管理用
出 力 , Math.sqrt, Hashtable の 操 作 の 3 種 ་ を 用 意 し
ハッシュテーブル
た.
使用する
System.out.println,Math.sqrt を 実 行 す る メ ソ ッ ド は ,
バージョン
そ れ ぞ れ 1 回 該 当 の 処 理 を 行 っ て い る . Hashtable の
更新
シグナル
A=1
バージョン
B=3
指定ファイル
操 作 を す る メ ソ ッ ド に つ い て は , Hashtable に 100 項
目 デ ー タ を ୈ 加 し , そ の ୈ 加 し た 100 項 目 を 参 照 す る
という処理を行う.
3 種་のバージョン管理対象のオブジェクトのメソ
ッ ド を , 通 常 の Kaffe 仮 想 マ シ ン , 今 回 開 発 し た
図 6 Kaffe / DVM の 構 成
Kaffe/DVM , 代 理 オ ブ ジ ェ ク ト を 用 い た 動 的 バ ー ジ ョ
ン 管 理 シ ス テ ム DVMS で そ れ ぞ れ 実 行 し て ‫ ڐ‬測 し た .
そのインデックスの切り替えを実現するために,
な お , DVMS で は メ ソ ッ ド の 初 回 ֬ 動 時 に バ ー ジ ョ
ハッシュテーブルを用意した.このハッシュテーブル
ン生成機能が働くため,全ての‫ڐ‬測は初回のメソッド
は,クラス名をキーとし,使用すべきバージョンのイ
呼び出しを除外した.
ン デ ッ ク ス 情 報 を 得 ら れ る も の で あ る . getfield が 実
行 さ れ る と ,引 数 か ら た ど り ク ラ ス 名 を 得 る .そ し て ,
6.4. 比 Ԕ 検 証 結 果
そのクラス名を元にハッシュテーブルを検索し,見つ
表 2 に,3 種་のサンプルについて‫ڐ‬測した結果を
かれば交換先のインデックス情報を得て,そのインデ
示 す . こ れ は , 各 メ ソ ッ ド を 100 回 , 150 回 , 200 回
ッ ク ス を getfield の 引 数 と し て 実 行 す る .
繰 り ඉ し て 実 行 す る 時 の 処 理 時 間 を 10 回 ‫ ڐ‬測 し , そ
今回ࠟ作の仮想マシンにはオプション指定するこ
の平均を求めたものである.
とで,バージョン管理機能の有効,無効を切り替えら
System.out.println や Math.sqrt に つ い て は , 以 前 の
れ る よ う に し た .こ れ に よ り ,デ フ ォ ル ト で は getfield
システムと比Ԕして今回ࠟ作したシステムが圧倒的に
を行う度にハッシュを検索する作業などは発生しない.
‫ݗ‬速であるとۗえる.
ハッシュテーブルの生成は,バージョン指定情報
し か し , Hashtable に 関 し て は 以 前 の シ ス テ ム の 方
が速いという結果が得られた.これは,システムのࠟ
の 実 行 時 間 の 差 を 求 め た も の で あ る . getfield の 実 行
作構想段階では,予想していなかった結果である.そ
回 数 は , Hashtable の サ ン プ ル 実 行 時 に 突 出 し て 多 い
の 原 因 と し て , getfield の 対 象 と な る オ ブ ジ ェ ク ト が
事 が 確 認 で き た . こ れ に よ り , 上 述 し た 通 り getfield
バージョン管理対象であるか否かの判定をするため,
の回数が多いため旧システムでのオーバーヘッドより,
getfield 命 令 が 実 行 さ れ る 度 に 仮 想 マ シ ン 内 に 組 込 ん
今回のシステムの方がૺくなったとۗえる.さらに,
だバージョン管理情報のハッシュテーブルに問い合わ
getfiled を 一 回 処 理 す る た め の Kaffe/DVM の オ ー バ ヘ
せ を 行 う た め で あ る こ と が 考 え ら れ た . getfield の 対
ッドは,サンプルによらずほぼ一定であることも確認
象となるオブジェクトがバージョン管理の対象となっ
できた.
ていない場合は,以前のシステムではその処理に伴う
オーバヘッドは発生しない.従って,バージョン管理
に 関 係 し な い getfield の 実 行 回 数 が 多 く な る に つ れ て ,
その処理時間が問題となる.
7. ま と め と 今 後 の Ӏ 題
オブジェクトの動的バージョン管理システムの実
行効率を改善するため,バージョン切り替え機能を組
み 込 ん だ Java 仮 想 マ シ ン Kaffe/DVM を ࠟ 作 し , そ の
表 2 平 均 処 理 時 間
メリット,デメリットを確認する事ができた.
サンプル 繰りඉし
プログラム 回数
println
sqrt
Hashtable
代理オブジェクトを用いたシステムと比Ԕし,今
Kaffe
Kaffe/DVM
DVMS
100
145.8
165.9
770.3
今回のࠟ作したシステムを有効に使用できるのはバー
150
219.7
247.3
1139.8
ジョン管理の対象とならないオブジェクトを対象とす
200
296.7
324.8
1520.8
る getfield が 少 な い 時 で あ る .
100
1.3
1.4
553
150
2
2.1
827.4
200
2.5
2.9
1115.7
100
3636.6
4431.9
4245.0
150
5424.8
6630.4
6348.6
200
7265.8
8852.6
8640.1
(単 位 : ms)
回ࠟ作したシステムが必ずしも優れている訳ではない.
今後のӀ題としては,バージョン切り替え機能の
改善と,今回は実装できなかった新バージョンの動的
生成機能の組み込みが挙げられる.
バージョン切り替え機能については,今回の評価
の 対 象 と し た の は getfield の み で あ っ た . し か し ,
getstatic, aload 等 に お け る バ ー ジ ョ ン 管 理 の た め の オ
ーバヘッドも考慮すると,実行速度が現状よりૺくな
る事は確実である.そのため,より効率の良い方式を
再度検討する必要がある.
一 方 Hashtable 以 外 の サ ン プ ル に つ い て は , 期 待 し
た通りの結果が得られているが,これについては,バ
ージョン管理されていないオブジェクトを対象とする
getfield の 実 行 回 数 が 少 な い た め , 以 前 の シ ス テ ム で
のリフレクションによるオーバーヘッドよりも
getfield の オ ー バ ヘ ッ ド が 少 な い た め で あ る と 考 え ら
れる.
新バージョンの生成機能は,生成の方式や生成タ
イミング等を検討しなければならない.
また,ユーザがシステムを運用する際,システム
中で使用されている各オブジェクトのバージョンの状
態を把握できる仕組みも導入する予定である.これに
より,バージョン変更作業がより容易になると考えて
いる.
表 3 getfield の 実 行 回 数 と オ ー バ ヘ ッ ド
文
サンプル
プログラム
getfield
の実行回数
(A)
オーバヘッド
(B)
getfield
一回あたりの
オーバヘッド
(B)/(A)
0.014ms
println
11000
158.9ms
sqrt
100
1.5ms
0.015ms
Hashtable
262200
4420.7ms
0.016ms
この推測を検証するため,表3に各サンプルでの
メ ソ ッ ド 呼 び 出 し 100 回 あ た り の getfield の 実 行 回 数
(A)と , そ の 際 に 発 生 す る Kaffe/DVM に お け る オ ー バ
ヘ ッ ド (B)を 示 す . (B)は 表 2 に お け る 200 回 と 100 回
献
[1] RCS, http://www.cs.purdue.edu/homes/trinkle/RCS/
[2] Rochkind, The Source Code Control System, TOSE,
IEEE, SE-1, No.4, pp.364-370, 1975
[3] 杉 山 安 洋 , Java ク ラ ス の 動 的 バ ー ジ ョ ン 管 理 の
構 想 , 情 報 処 理 学 会 研 究 報 告 , 97-SE-115,pp.4956,1998.
[4] 杉 山 安 洋 , 戸 ൉ 勝 文 , 動 的 バ ー ジ ョ ン 管 理 に 基
づく実行中のソフトウェア発展法,情報処理学
会 研 究 報 告 , 98-SE-119,pp.49-56,1998.
[5] テ ィ ム・リ ン ド ホ ル ム ,フ ラ ン ク・イ ェ リ ン ,Java
仮想マシン仕様 第 2 版,株式会社ピアソン・
エ デ ュ ケ ー シ ョ ン , 2001
[6] Transvirtual Technologies, Kaffe, http://kaffe.org