[Armadillo:03402] Re: Armadillo-9+SableVMにてOutOfMemoryError

Hidekazu Morikawa email@hidden
2008年 9月 22日 (月) 13:12:59 JST


金井様

お返事ありがとうございます。
以下のような1秒に1回スレッドを生成するプログラムで約1000秒後に
OutOfMemoryErrorが出ます。

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

  public ThreadTest() {
  }


  private void start(){
    int no = 0;
    while(true){
      try {
        Thread.sleep(1000);
      }
      catch (InterruptedException ex) {
      }
      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");
    }
  }
}

Topコマンドで確認しましたがCPU負荷率は10%以下で余裕があるように思います。
また-verbose-gcオプションにてGCの動きを見ましたがGCが一度も走っておりま
せん。
以上のことからGC処理が追いついていないというよりもGC対象になっていない気
がします。

また、Pingは金井さんおっしゃられる通り一つのスレッドで発行していますが同
じようにOutofMemoryErrorが出ます。

恐らく
Process process = Runtime.getRuntime().exec("ping xxx.xxx.xxx.xxx");
にて新たなProcessが生成され、これがGC対象になっていないのではと思います。

確かにArmadilloの問題ではありませんが、同じような状況にあった方が見えた
らと思いご質問させていただきました。
メーリングリストの趣旨から外れているるのであれば申し訳ありません。

なお他のJVMに関して過去ログも調べてみましたが、blackdownのサイトがない、
もしくはsunのjreは90日評価版とのことでご質問させていただきました。


Toshifumi Kanai さんは書きました:
> 金井といいます。
> 
> Armadiiloの問題というよりは、Javaの問題になっているような気がしますが・・・
> 
> なんとなく処理の負荷が重くてGCが間に合っていないような気がします。
> PCでは動くといっても、PCの処理能力は、比較にならないほど高くて
> CPUに余裕があるので間に合っているように思えます。
> 一定間隔でThreadを立てているとのことですが、どのくらいの間隔なのでしょうか?
> 間隔をあけてみると変化はおきませんか?
> 
> Pingを別スレッドで行いたいなら、毎回スレッドを立てるのではなく、常に一つのスレッド
> を動かした状態にしておいて、その中で時間を計ってPingを行うのはいかがでしょうか?
> 
> 他のJavaVMについては、過去ログに幾つか紹介させていただいています。
> 




armadillo メーリングリストの案内