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

Toshifumi Kanai email@hidden
2008年 9月 22日 (月) 17:52:50 JST


森川 さま

> 恐らくexecメソッドの返り値ProcessがGC対象にならないのだと思います。
例えば、pingが終わったら
process = null;
を行って、明示的にインスタンスを開放するようにしてみたらどうでしょうか?

また、定期的にSystem.gc()を行うのもいいかもしれません。


2008/09/22 16:06 Hidekazu Morikawa <email@hidden>:
> 金井様
>
> 回答ありがとうございます。
> 2つの事象を書いているためややこしくなっているかもしれません。
> すいません。
>
> そもそも「Threadはrunメソッドを抜けるとGC対象となる」べきものです。
> これがGCされずにOutOfMemoryErrorとなっているのがおかしいのではというご質
> 問でした。
> サンプルは上記の「Threadはrunメソッドを抜けるとGC対象となる」というのを
> 検証するために作成したものです。
> 金井様が修正してくださったサンプルは確かにスレッドを1つしか作らないので
> OutOfMemoryErrorは起こりませんが、私が想定しているのとはちょっと違います。
>
> Pingに関しては単一スレッドで一定時間ごとに送っていますが、それでも
> OutOfMemoryが発生します。
>
> サンプルを作成すると以下のようなイメージとなります。
>
>
> 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{
>        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();
>  }
> }
>
> 上記の通り単一スレッド内でRuntime.getRuntime.exec()を呼び出しても
> OutOfMemoryします。
> 恐らくexecメソッドの返り値ProcessがGC対象にならないのだと思います。
>
> 先ほどの回答を送ってから金井様の過去ログを見つけました。
> 現在PhoneMeを試しているところです。
> 失礼いたしました。
>
>
> Toshifumi Kanai さんは書きました:
>> 森川様
>>
>>> また、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日にお答えしました。参照してください。
>>
>
> --
> /**
> * 森川 秀一(もりかわ ひでかず)
> *
> * (有)アックシステム
> * tel:059-330-6111
> *  IP:050-5805-1165
> * fax:059-330-6112
> **/
> _______________________________________________
> armadillo mailing list
> email@hidden
> http://lists.atmark-techno.com/cgi-bin/mailman/listinfo/armadillo
>



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