2012-04-25 63 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

回答