2012-04-25 26 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'的输出以获取有关如何执行此操作的信息。 – 2012-04-26 05:18:46

+0

我用'./program + RTS -H4096K'限制了堆,并且和以前一样,程序为每次递归调用构建内存。 – Plankt 2012-04-26 07:46:05

+0

HDBC有可能与外来物体相连接,在主要GC发生之前不会释放。由于GC不知道异物的大小,因此不会将其视为堆压力的原因,从而导致GC数量减少。 HDBC也可能只是不能释放所需的资源。尝试一个爆炸'performGC' – 2012-04-26 11:44:49

回答