Haskell中的空间泄漏

18

我已经多次阅读过有关Haskell的惰性求值可能会导致空间泄漏的内容。什么样的代码会导致空间泄漏?如何检测它们?程序员可以采取哪些预防措施来避免它们?


7
请看Edward Z. Yang的Space leak zoo - Michael Steele
2个回答

13

你可能会得到很多答案,这是我在尝试进行一些“实际应用程序”时遇到的问题之一。我正在使用多线程和一些MVar来传递数据(MVar类似于锁定的共享内存)。我的典型模式是:

a <- takeMVar mvar
putMVar mvar (a + 1)

然后,有时候,当发生适当的条件时,我会做如下操作:

a <- takeMVar mvar
when (a > 10) ....
问题在于mvar的内容本质上是(0 + 1 + 1 + 1 + ....),对于像100k这样的数字来说,这是相当密集的...这种类型的问题在我的代码中相当普遍;不幸的是,对于多线程应用程序来说,很容易陷入这样的问题。
我的解决方法是启动Haskell以产生有关内存消耗的数据,启动和停止不同的线程,并查看内存占用量是否稳定...
参考链接:一份关于thunk泄漏的解剖指南(含有调试说明) 例如:map函数导致thunk内存泄漏的例子

3
我曾在处理大型数据结构的递归时遇到这个问题。累积的thunk会变得太多,从而导致空间泄漏。
在Haskell中,您需要时刻注意可能遇到空间泄漏的情况。由于没有迭代,基本上任何递归函数都有可能产生空间泄漏。
为了避免这个问题,请对递归函数进行记忆化处理,或者将它们重写为尾递归形式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接