From: Hiroshi I. <ig...@ru...> - 2003-10-04 12:48:46
|
いがらしです。 At Sat, 4 Oct 2003 02:04:17 +0900, Masao Mutoh <mu...@hi...> wrote: > > [ 814787 ] Memory leak in Gdk::Pixbuf > http://sourceforge.net/tracker/index.php?func=detail&aid=814787&group_id=53614&atid=470969 > > の件で、確認をしているのですが、 > 確かに上記にあるサンプルを動かすと画面が固まります。 > > でも、GC.startを入れれば正常に動作します。 いまはobsoleteなGdk::Imlibでも同じ問題がありました。 http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-ext/1630 まさ私のやり残しですね。ごめんなさい。 ruby-gnomeのGdk::Imlib#renderでは、こんな風に 外部ライブラリが内部である程度メモリを使ったであろう時点で 明示的にGCを起動しています。rb_gdkimlib_render_limitを いくつにすればいいのかというのが難しいんですが。 render_count += FIX2INT(w) * FIX2INT(h); if(render_count > rb_gdkimlib_render_limit){ rb_gc(); render_count = 0; } > で、これの考え方なんですが、 > > 「GC.startをすればメモリリークが起きないのであれば > Ruby-GNOME2としては問題ない」 > > と考えて良いのですかね? そうですねぇ。でもそれなりにコストの大きいGCを 起動したくないという場面もあるかも。画像以外にも たくさんオブジェクトがいるときとか。 IO#closeのように明示的にリソース解放できるのが 一番いいかと思うのですが、Gdk::Pixbuf#destroy なんていうのはないんですよね。Cレベルでは あるのかは調べてません。 > あと、(1)でref_countの値が2のままだと指摘されて > ますが(たぶん)、これは、 > img.pixbuf = pb で + 1される > pb.ref_countのGOBJ2RVALで+1される > から、2で問題ないですよね? たぶん。 -- 五十嵐 宏 (Hiroshi IGARASHI) |