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

Toshifumi Kanai email@hidden
2008年 9月 22日 (月) 15:15:12 JST


森川様

> また、Pingは金井さんおっしゃられる通り一つのスレッドで発行していますが同
> じようにOutofMemoryErrorが出ます。
私がイメージした処理方法でサンプルを書き換えると以下のようになります。

public class ThreadTest {

	public static void main(String[] args) {
		ThreadTest threadtest = new ThreadTest();
		threadtest.start();
	}
	
	public ThreadTest() {
	}
	
	
	private void start(){
		int no = 0;
		
		Thread t = new MyThread(no);
		t.start();
		
	}
	
	private class MyThread extends Thread{
		public boolean stop = false;
		private int no;
		
		public MyThread(int no){
			this.no = no;
		}
		
		public void run(){
			while(!stop) {
				
				System.out.println("Thread" + Integer.toString(no)  + " Start");
				
				try {
					Thread.sleep(1000);
				}
				catch (InterruptedException ex) {
				}
				
				no++;
			}
			

		}
	}
}

違いはお判りだと思いますが、森川様のはMyThreadクラスのインスタンスを1秒ごとに
作る点と私のはMyThreadクラスのインスタンスは、一回のみである点です

これでもだめでしょうか?

なお、他のJavaVMやblackdownが現在でも入手できる場所の情報を
このメーリングリスト内で8月28日にお答えしました。参照してください。

2008/09/22 13:12 Hidekazu Morikawa <email@hidden>:
> 金井様
>
> お返事ありがとうございます。
> 以下のような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 mailing list
> email@hidden
> http://lists.atmark-techno.com/cgi-bin/mailman/listinfo/armadillo
>



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