JikesRVMのGC作り 準備編

JikesRVMでGC作り - I am Cruby!
えらい日本語の情報が少ないJikesRVMについてちょっとずつ調べながら説明するシリーズ。

jikesrvmにはMMTkというメモリ管理ライブラリがあって、こいつをカスタマイズしてGCを作るらしい。
http://jikesrvm.org/MMTk+Tutorialをすすめてみよう。

概要

GCをスクラッチから作ってみようじゃないか。MMTkの「GCなし!」の状態からはじめる。
このチュートリアルではMMTk内のGCを実際に作っていく。howを教えるのが目的でwhyの気持ちはすてろ!
このチュートリアルには2つの目的がある。

  1. MMTkのメカニズムを知ってもらおう
  2. 結構難しめのGCをMMTkで作るのは難しくないってことも知ってもらいたいんだよ!

※ jikesrvmのバージョンは3.0.2以上を使え

準備(eclipse)

1. JikesRVMで「Hello World」 - I am Cruby!を参考にしてビルド
2. $ ./bin/buildit localhost BaseBaseNoGC を実行するべし

むむ、"export JAVA_HOME=/opt/jdk1.6.0"のコードが走ってしまう。
以下のコマンドで正しいJAVA_HOMEを指定してやる。

$ sudo ./bin/buildit localhost BaseBaseNoGC -j "/usr/lib/jvm/java-1.5.0-sun/"

しかも権限周りで落ちるので(いつものこと) sudo で実行する。
実行が終わると、distの下にrvmが作成される。

3. http://jikesrvm.org/Editing+JikesRVM+in+an+IDEを参考にeclipseで開いてみる。

eclipse用のプロジェクトを作る。

$ sudo ./bin/buildit -j "/usr/lib/jvm/java-1.5.0-sun/" --eclipse localhost

eclipseでインポート。画像がhttp://jikesrvm.org/Editing+JikesRVM+in+an+IDEに張ってあるのでわかりやすいはず。

4. http://jikesrvm.org/The+MMTk+Test+Harnessを参考にMMTk Test Harnessをセットアップしよう。

MMTk harnessっていうのはデバッグ用のツールで、MMTkの簡単なクライアントらしい。
Javaに似た簡単スクリプト言語らしい。MMTkにオブジェクトを作成・削除・参照の削除とか指示できると。
で、harnessで書いたテストがあるから、それを実行するための設定が以下。

以下のコマンドでえくりぷすようにharnessをビルド。

$ sudo ant mmtk-harness-eclipse-project

って、失敗すると思ったら、またリンク切れがあるじゃないか!
てめーこのやろー!

以下のパッチで修正。

diff --git a/build/components/javacc.xml b/build/components/javacc.xml
index 3e264e9..471e133 100644
--- a/build/components/javacc.xml
+++ b/build/components/javacc.xml
@@ -36,7 +36,7 @@
     <property name="javacc.web-archive" value="javacc-${javacc.version}.zip"/>
     <mkdir dir="${javacc.package.dir}"/>
     <cachedGet key="${javacc.web-archive}"
-         src="https://javacc.dev.java.net/files/documents/17/26777/${javacc.web-archive}"
+         src="http://java.net/projects/javacc/downloads/download/oldversions/${javacc.web-archive}"
          dest="${javacc.package.dir}/${javacc.web-archive}"/>
     <unzip src="${javacc.package.dir}/${javacc.web-archive}" dest="${javacc.package.dir}"/>
     <writeComponentConstants dir="${javacc.dir}"/>

なぜかビルドが通らなかったので以下のようにソース修正。

diff --git a/MMTk/ext/vm/harness/org/mmtk/harness/vm/Statistics.java b/MMTk/ext/vm/harness/org/mmtk/harness/vm/Statistics.java
index eeee1cf..4ea6c10 100644
--- a/MMTk/ext/vm/harness/org/mmtk/harness/vm/Statistics.java
+++ b/MMTk/ext/vm/harness/org/mmtk/harness/vm/Statistics.java
@@ -99,4 +99,15 @@ public class Statistics extends org.mmtk.vm.Statistics {
     //Assert.notImplemented();
     return 0;
   }
+
+  public void perfEventInit(String events) {
+    //Assert.notImplemented();
+  }
+
+  /**
+   * Read a performance event value
+   */
+  public void perfEventRead(int counter, long[] values) {
+    //Assert.notImplemented();
+  }
 }
diff --git a/MMTk/harness/src/org/mmtk/harness/options/HarnessOptionSet.java b/MMTk/harness/src/org/mmtk/harness/options/HarnessOptionSet.java
index be8ec10..a75066e 100644
--- a/MMTk/harness/src/org/mmtk/harness/options/HarnessOptionSet.java
+++ b/MMTk/harness/src/org/mmtk/harness/options/HarnessOptionSet.java
@@ -174,7 +174,7 @@ public final class HarnessOptionSet extends org.vmutil.options.OptionSet {
     }
     int[] result = new int[values.size()];
     for (int i=0; i < result.length; i++) {
-      result[i] = values.pollFirst();
+      result[i] = values.first();
     }
     return result;
   }
@@ -192,7 +192,7 @@ public final class HarnessOptionSet extends org.vmutil.options.OptionSet {
     }
     Word[] result = new Word[values.size()];
     for (int i=0; i < result.length; i++) {
-      result[i] = values.pollFirst();
+      result[i] = values.first();
     }
     return result;
   }

権限周りが原因となって、eclipse上でコケルているので、otherのユーザに書き込み権限を渡しておく(モウダメダ)。

$ sudo chmod -R o+w .

また、eclipse上では、JRE System Library の java6 を追加したらコンパイルが通るようになった。

準備(チュートリアルGC)

org.mmtk.plan.nogcパッケージはGC作成用の雛型。

1. org.mmtk.plan.nogcのパッケージをorg.mmtk.plan.tutorialにコピー(eclipse上でね)。
2. クラス名のNoGC*をTutorial*にリネーム(eclipseだとRefactor->Renameでできる)
3. MMTk Harness のオプション(plan=org.mmtk.plan.tutorial.Tutorial)に変える。
4. build/configs/BaseBaseTutorial.propertiesを作って、"config.mmtk.plan=org.mmtk.plan.tutorial.Tutorial"だけ書き込む。
5. もう一度ビルドする

$ sudo ./bin/buildit localhost BaseBaseNoGC -j "/usr/lib/jvm/java-1.5.0-sun/"

生成された rvm は実行するときに、build/configs/BaseBaseTutorial.propertiesで指定したものを使用する。

$ dist/BaseBaseTutorial_ia32-linux/rvm HelloWorld

とやったときには、MMTkはTutorialが利用される。

次回はマーク・スイープGCを作ってみようー。