LG3Dがメモリリークを起こします!

View: New views
3 Messages — Rating Filter:   Alert me  

LG3Dがメモリリークを起こします!

by interest_ja :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

 こんにちは、DavidHou@九州工業大学小出研究室と申します。

 初めての投稿です、これからどうぞよろしくお願いします。

 皆様がご存知のように、小出研究室が開発したコスモスケジューラーD(以下CSDと略称)は今年「ねころがー」と連携して未踏プロジェクトに採択されまして、小出先生ご自分も薬師寺さんに引き続きスーパクリエータになりました。さくらばさんのフォーラムに紹介があります(http://forums.java.net/jive/thread.jspa?threadID=19558&tstart=0)。

 自分は今年のコスモスケジューラDの開発で小出先生の手伝いとしてプロジェクトの一部のコーディングに参加させていただきました。そこでLG3Dがメモリリークを起こすことが分かりました。

 普通のLG3Dのアプリはたくさんのテクスチャを扱うことが少ないため、あまりメモリリークを起こしませんが、今年のCSDは何百枚も違う画像を扱うため、使い終わったテクスチャがGCの対象にならなくていつまでもメモリに溜まってます。1024*768ぐらいの画像が100枚ぐらいまで行きますと、メモリリークが発生しVMが死にます。たくさんの画像を同時に表示するのではなく、切り替えながら表示するような感じです。詳しい話はさておいて以下のコードで簡単に確認できます。
 
  public class Test {

      public Test(){
          int max = 100;
       
          for(int i = 0; i<max; i++){
                       
               Appearance appearance = null;
               try {
                    appearance = new SimpleAppearance("1.jpg");
               } catch (Exception e) {
                    e.printStackTrace();
               }
               WeakReference wr_app = new WeakReference(appearance);

               Box box = new Box(0.02f, 0.02f, 0.02f,Box.GENERATE_TEXTURE_COORDS, appearance);
               WeakReference wr_box = new WeakReference(box);
                       
               Component3D component = new Component3D();
               WeakReference wr_com = new WeakReference(component);
                       
               //component.addChild(box);
                       
               component = null;
               appearance = null;
               box = null;
                       
               System.gc();
                       
               System.out.println("wr_com.get() = " + wr_com.get());
               System.out.println("wr_app.get() = " + wr_app.get());
               System.out.println("wr_box.get() = " + wr_box.get());
               System.out.println("-----------------------" 
                  + i + "-----------------------");
                       
               //1秒待ちます
               try {
                    Thread.sleep(1000);
               } catch (InterruptedException e) {
                    e.printStackTrace();
               }
          }
     }

     public static void main(String[] args) {
          new Test();
     }
}

注:このソースを実行するためにLG3Dの起動オプションにある-XX:+DisableExplicitGCを削除する必要がなります、でないとソースからSystem.gc()を呼び出してもGCが始まりません。
実行結果は以下です。

wr_com.get() = org.jdesktop.lg3d.wg.Component3D@1b01afa -1:93
wr_app.get() = null
wr_box.get() = null
-----------------------0-----------------------
wr_com.get() = org.jdesktop.lg3d.wg.Component3D@4204 -1:94
wr_app.get() = null
wr_box.get() = null
-----------------------1-----------------------
 この結果でいえば、AppearanceとBoxのインスタンスはGCに回収されますが、Component3DのインスタンスはGCに回収されません。このソースではComponent3Dのインスタンスを参照しているのはcomponentだけで、NULLを代入してもGCに回収されません。componentだけではなく、Component3Dのインスタンスを作った時点ですでにどこかに参照されていることになるでしょうか。
  実行時のヒープメモリの状況を把握するために //component.addChild(box) 行のコメントをはずします。LG3Dの起動オプションの最初に-Dcom.sun.management.jmxremote をつけてJDKのbinにあるツールjconsole(メモリタブで)を使ってヒープメモリの使用状況をグラフで見てみました。驚くほどの勢いでメモリがなくなっています。変数maxを大きくしたら、そのうちにメモリリークが発生します。
 ちなみに//component.addChild(box)のコメントを外しますと、AppearanceとBoxのインスタンスもGCに回収されなくなります。componentに参照されているからです。

 さて、状況報告はここまでですが、これについて皆様のご意見を聞かせていただけないでしょうか。
 
  ちなみにこれはLG3D0.7.0でテストした結果です。1.0ではテストしようと思いましたが、1.0で自分の書いたプログラムを動かすための[b]起動オプション[/b]が分からなくてテストできませんでした。何方か教えていただけたら助かります。
 
  どうぞよろしくお願いします。
[Message sent by forum member 'daweihou' (daweihou)]

http://forums.java.net/jive/thread.jspa?messageID=173657

Re: LG3Dがメモリリークを起こします!

by interest_ja :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Davidさん、

こんにちは。

>  ちなみにこれはLG3D0.7.0でテストした結果です。1.0ではテストしようと思いましたが、1.0で自分の
> 書いたプログラムを動かすための[b]起動オプション[/b]が分からなくてテストできませんでした。何方か教えて
> いただけたら助かります。

内部がどこまで変わったのかは把握していませんが、とりあえず最新で試してみてはいかがでしょうか?

- manifest にコンフィグファイル(Cosmoの場合、cosmo.lgcfg)の指定を書く
- コンフィグファイルにアプリケーションの情報(名前、アイコン、クラスパス等)を書く
- 上記を含む jar ファイルを作成
- lg3d/ext/app にコピー

という手順で、アプリケーションがメニューに追加されますので、
LG3Dから立ち上げることができます。
エラー等が出た場合には /var/tmp/lgserver.log (linux/solaris)
に出力されますし。

cosmo.lgcfgはこんな感じですね。
https://lg3d-incubator.dev.java.net/source/browse/lg3d-incubator/src/config/cosmo.lgcfg?rev=1.7&view=markup


たしか、0.8以降だったと思うのですが、SimpleAppearanceは引数にURLを
取るように変わったので多少変更が必要ですね。;-)

# 0.7系のようにNetBeansからアプリを直接立ち上げたいのですが、
# いまだにできてません…(泣)。
# あんまり調査してないんですけどね。^-^;

ふじつき
[Message sent by forum member 'thaniwa' (thaniwa)]

http://forums.java.net/jive/thread.jspa?messageID=173832

Re: LG3Dがメモリリークを起こします!

by interest_ja :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Thanks you very good; thanks for add to your informations;

[url=http://www.kontorbayim.com]kontur[/url]
[url=http://www.kontorbayim.com]kontür[/url]
[url=http://www.kontorbayim.com]kontor[/url]
[url=http://www.kontorbayim.com]kontör[/url]
[url=http://www.kontorbayim.com]parça kontör[/url]
[url=http://www.kontorbayim.com]turkcell parça kontör[/url]
[url=http://www.kontorbayim.com]vodafone parça kontör[/url]
[url=http://www.kontorbayim.com]avea parça kontör[/url]
[url=http://www.kontorbayim.com]telsim parça kontör[/url]
[url=http://www.kontorbayim.com]parca kontor[/url]
[url=http://www.kontorbayim.com]parca kontür[/url]
[url=http://www.kontorbayim.com]parça kontor[/url]
[url=http://www.kontorbayim.com]parça kontür[/url]
[url=http://www.kontorbayim.com]kontor yükle[/url]
[url=http://www.kontorbayim.com]kontör yükle[/url]
[url=http://www.kontorbayim.com]ucuz parca kontor[/url]
[url=http://www.kontorbayim.com]ucuz parca kontör[/url]
[url=http://www.kontorbayim.com]ucuz parca kontur[/url]
[url=http://www.kontorbayim.com]ucuz parca kontür[/url]
[url=http://www.kontorbayim.com]ucuz parça kontür[/url]
[url=http://www.kontorbayim.com]ucuz parça kontor[/url]
[url=http://www.kontorbayim.com]ucuz parça kontör[/url]
[url=http://www.kontorbayim.com]ucuz kontör[/url]
[url=http://www.kontorbayim.com]ucuz kontör[/url]
[Message sent by forum member 'nasilyani02' (nasilyani02)]

http://forums.java.net/jive/thread.jspa?messageID=298702

---------------------------------------------------------------------
To unsubscribe, e-mail: interest_ja-unsubscribe@...
For additional commands, e-mail: interest_ja-help@...