かんだでし

NAKAMURA Hi-deki- <deki / pfu.co.jp>さんの書かれた、
	「[ruby-ext:00351] Re: Ruby/Gtk + Imlib patch」
からの引用です。

> 仲村です。
> 

> |GCの発生するのは
> |
> |  * 明示的に呼んだ時(GC.start)
> |  * heapを使い切った時
> |  * mallocの総計がある一定数を越えた時
> |  * file descriptorを使い切った時
> |
> |などです.基本的にメモリ割当の瞬間に起きますが,予測するのは
> |不可能なタイミングですね.
> 
> と、ありました。これがGC発生のトリガなんですよね。

> [ruby-dev:3527]の上の文章を読んで、今回起こっている現象の原因予想と、
> 予想から思いつく対策を以下に示してみます。当たっているかどうか。。
> 
>   get_pixmapではData_Wrap_Struct()をつかっており、Data_Wrap_Struct()は
>   Rubyの知らないところで獲得されたメモリ領域をラップするマクロである。
>   そのため、Data_Wrap_Struct()でラップされるメモリは、上の「mallocの総
>   計がある一定数を越えた時」の総計計算の対象ではない。そのため、なかな
>   か自動的にGCが発生する条件がそろわなかった。しかも、扱うデータは画像
>   データであり個々のデータが大きいので、増え方が目立つ。

  あ、なるほど。Data_Wrap_Struct() で持つ構造体のサイズが膨大なんですね。
  ちょうど、GC のタイミングに「malloc() が一定数を越えたとき」ってのが
あるらしいので、構造体のメモリ確保に ruby の malloc() である xmalloc() を
使ってみればいいんじゃないでしょうか?

  gc.c で定義されている xmalloc() は。。。
-------------------------------------------------------------------------
void *
xmalloc(size)
    size_t size;
{
  ...
    malloc_memories += size;
    if (malloc_memories > GC_MALLOC_LIMIT && alloc_objects > GC_NEWOBJ_LIMIT) {
        rb_gc();
    }
  ...
-------------------------------------------------------------------------

  だから、rb_gc() 呼ばれると思います。