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

Toshifumi Kanai email@hidden
2008年 9月 22日 (月) 19:06:34 JST


森川 さま

> PhoneMEのmake方法がわかりませんでしたので現在jre1.3.1を試しているところ
> です・・・。
私がATDE2環境でmakeした時は、以下のようにしました。
 入手したソースファイルを開発用Linuxマシン(PC)の適当なディレクトリ上で展開する。
 カレントディレクトリを展開されたディレクトリ下のcdc/build/linux-arm-genericにする。
 以下のように入力してメイクを実行する(今回はATDE2環境で行った場合を記述)。
   make CVM_TARGET_TOOLS_PREFIX=/usr/bin/arm-linux-
J2ME_CLASSLIB=foundation CVM_HOST_TOOLS_PREFIX=/usr/bin/
CVM_JAVA_TOOLS_PREFIX=/usr/local/j2sdk1.4.2_18/bin/
JDK_HOME=/usr/local/j2sdk1.4.2_18/bin/ CC_ARCH_FLAGS=-mcpu=arm920t
CVM_JIT?=false

   CVM_TARGET_TOOLS_PREFIX:ターゲット用のgccの場所を記す(ターゲット用のgccがarm-linux-gccの時は、gccの前まで含める)
   CVM_HOST_TOOLS_PREFIX :ホスト(PC)用のgccの場所を記す
   CVM_JAVA_TOOLS_PREFIX :ホストにインストールしたJDKの実行ディレクトリ名を記す
   JDK_HOME        :上と同じにする
 makeが成功するとbinディレクトリとlibディレクトリが作成される。


2008/09/22 18:21 Hidekazu Morikawa <email@hidden>:
> 金井様
>
> お返事ありがとうございます。
> process=nullなど明示的にインスタンスを開放する。
> System.gc();をするなどは試してみましたが、改善されませんでした。
>
> 英語につたないので自信がありませんが、どうもSableVM1.13のThreadまわりで
> バグがあるようです。
>
> http://www.nabble.com/Problem-in-Thread.c-to3940146.html
>
> PhoneMEのmake方法がわかりませんでしたので現在jre1.3.1を試しているところ
> です・・・。
>
>
>
> Toshifumi Kanai さんは書きました:
>> 森川 さま
>>
>>> 恐らく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 mailing list
>> email@hidden
>> http://lists.atmark-techno.com/cgi-bin/mailman/listinfo/armadillo
>>
>>
>> ------------------------------------------------------------------------
>>
>>
>> No virus found in this incoming message.
>> Checked by AVG - http://www.grisoft.jp
>> Version: 8.0.169 / Virus Database: 270.7.0/1683 - Release Date: 2008/09/21 10:10
>>
>
>
> --
> /**
> * 森川 秀一(もりかわ ひでかず)
> *
> * (有)アックシステム
> * 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 メーリングリストの案内