ひでっぷの技術メモ

はてなダイアリーから移行しました

SableVM1.13のバグ?

どうもSableVM1.13のGCにはバグがあるようです。


public class ThreadTest {
public ThreadTest() {
super();
}

public static void main(String args) {
ThreadTest threadtest = new ThreadTest();
threadtest.start();
}

public void start(){
int no = 0;
while(true){
try {
Thread.sleep(1000);
}
catch (InterruptedException ex) {
}
//1秒ごとにThreadを生成する
Thread t = new MyThread(++no);
t.start();
}
}

/**
* 独自のスレッドクラス
*/
private class MyThread extends Thread{
private int no;

public MyThread(int no){
this.no = no;
}

public void run(){
System.out.println("Thread" + Integer.toString(no) + " Start");
}
}
}

1秒に1回Threadを生成するだけのコードです。
このコードをArmadillo-9のSableVM1.13で走らせると1000秒後くらいにOutOfMemoryErrorが出ます。
java起動時に-verbose:gcオプションをつけてみるとGCを一度もせずにOutOfMemoryErrorとなりました。
Threadはrunメソッドから抜けるとGC対象にならないといけないのですがGC対象になっていないようです。

また以下のようなプログラムでも同様にOutOfMemoryErrorとなります。


public class PingTest {

public PingTest() {
}

public static void main(String args) {
PingTest pingtest = new PingTest();
pingtest.start();
}

public void start(){
int no = 0;
while(true){
try {
Thread.sleep(1000);
}
catch (InterruptedException ex) {
}
try{
//1秒に1回pingを打つ
ping();
}
catch(IOException ex){
}
}
}
private void ping() throws IOException{
Process process = Runtime.getRuntime().exec(ping xxx.xxx.xxx.xxx);
 process.waitfor();
//判定処理は割愛
process.getInputStream().close();
process.getOutputStream().close();
process.getErrorStream().close();
}
}


process=nullと明示的に参照をはずしたりしてみましたが効果はありませんでした。

色々なサイトを調べてみるとこれに関連しているような書き込みを見つけました。

Problem in Thread.c

英語力がまるでないので何とも言えませんが(汗)どうもThreadのGCにかかわる部分でバグがあると書いてあるようです。
Runtime.exec()も生成されるProcessはThreadで出来ているのかなあと思っています(根拠はありません)
今回Runtime.exec()を使用してPingをうつ部分は必須になってくるのでこの時点でSableVMを使用するのをあきらめました・・・。