2012-04-25 9 views
4

先日、リソースプールとHDBCをまとめようとしましたが、各クエリでメモリが上昇し続けることに気付きました。私は、できるだけ少ないの機能を使用して一緒に簡単なテストコードを入れて、この得た:Haskell HDBCメモリリーク

data SQL = SQL (Pool Connection) 
check :: SQL -> IO() 
check (SQL pool) = do res <- query' pool "show status like 'Threads_conn%'" [] 
         threadDelay 100000 
         check (SQL pool) 

全体コード:チェック機能の各再帰について http://upaste.me/40f2229cef7157f

を、プログラムはより多くのメモリを使用しています。結果が新しい再帰呼び出しでガベージコレクションされるべきではないか、または「必要な場合」にプログラムがその関数を終了するまでメモリに残るのでしょうか?

+1

ガベージコレクションが発生しません。ヒープを少し制限するとどうなりますか?これを行う方法については、 './yourprogram + RTS -h'の出力を確認してください。 –

+0

私は './program + RTS -H4096K'でヒープを制限しました。以前のように、プログラムは各再帰呼び出しに使用されるメモリを構築します。 – Plankt

+0

HDBCには、異物にファイナライザが付いている可能性があります。このファイナライザは、大きなGCが発生するまで割り当て解除されません。 GCは外部オブジェクトのサイズを知らないため、ヒープ・プレッシャーに寄与しているとは見なされず、結果としてGCが少なくなります。 HDBCは必要なリソースを解放していない可能性もあります。 Exploit 'performGC'を試してください –

答えて

1

後期フォローしていますが、使用していたプールのバージョンによっては、プールの実装自体にバグであったかもしれない:ヒープがいっぱいになるまでhttps://github.com/bos/pool/pull/4