【发布时间】:2015-09-05 02:08:16
【问题描述】:
当使用 Haskell HDBC-ODBC 库连接到 Microsoft SQL Server 时,我遇到了严重的内存泄漏。
import Database.HDBC
import qualified Database.HDBC.ODBC as ODBC
import Control.Monad
-- | Main application.
main :: IO ()
main = dbTest
dbTest :: IO ()
dbTest = do
let connStr = "DSN=TESTDB;Uid=sa;Pwd=password"
conn <- ODBC.connectODBC connStr
replicateM_ 20000 (loop conn)
disconnect conn
where
loop c = do
result <- getTables c
commit c
putStrLn $ show result
运行堆分析器使我的内存使用量保持不变,但 Window 报告内存使用量增加到近 100MB。
http://i.stack.imgur.com/YkUTW.png
对我来说,这似乎是 ODBC 驱动程序的 Foreign Function 接口中的内存泄漏,但这是我第一次分析代码,所以我不能确定。有没有人对修复有任何进一步的见解或建议?在循环中调用 System.Mem.performGC 尝试清理没有效果。
除了使用 HDBC-ODBC 之外,还有其他选择吗?如果没有,我可能需要学习 F#。
【问题讨论】:
-
任意猜测:删除
commit c有影响吗? -
不,提交 c 根本没有任何区别。同样使用 quickQuery' 而不是 getTables 会导致相同的内存泄漏。
标签: haskell memory memory-leaks