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 がどこで生成されているか見るべきだな。