Boehm GC の Repeated allocation of very large block 問題

c.l.sで指摘されている件。

以下のようなコードを 32bit 環境の Mosh で実行すると大量に「Repeated allocation of very large block」という警告が出る。

(import (rnrs))

(define (fact n)
  (let f ((n n) (r 1))
    (if (< n 2) r
       (f (- n 1) (* r n)))))

(and (fact 100000) #t)


これは Boehm GC の警告。
大きなブロックが何回も allocate されているよという意味なのだけど、本質は Debugging Garbage Collector Related Problems にあるように上のコードを実行する過程で false pointer が大量に生成されること。
これならば 64 bit 環境で発生しないのもうなずける。


解決方法を思いつかなくて困っている。

  • GMP の allocation が問題みたいなので mp_set_memory_functions で GC_malloc_atomic を指定したいがこれは NG らしい。
  • GC_realloc のかわりに Debugging Garbage Collector Related Problems にある realloc 実装を使ってみたが、改善せず。
  • false pointer にならないような工夫をする。(格納の仕方とか?)


もう少しつっこんで、 false pointer がどこで生成されているか見るべきだな。