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
を、プログラムはより多くのメモリを使用しています。結果が新しい再帰呼び出しでガベージコレクションされるべきではないか、または「必要な場合」にプログラムがその関数を終了するまでメモリに残るのでしょうか?
ガベージコレクションが発生しません。ヒープを少し制限するとどうなりますか?これを行う方法については、 './yourprogram + RTS -h'の出力を確認してください。 –
私は './program + RTS -H4096K'でヒープを制限しました。以前のように、プログラムは各再帰呼び出しに使用されるメモリを構築します。 – Plankt
HDBCには、異物にファイナライザが付いている可能性があります。このファイナライザは、大きなGCが発生するまで割り当て解除されません。 GCは外部オブジェクトのサイズを知らないため、ヒープ・プレッシャーに寄与しているとは見なされず、結果としてGCが少なくなります。 HDBCは必要なリソースを解放していない可能性もあります。 Exploit 'performGC'を試してください –