我已经读过很多遍了,Haskell中的惰性评估有时可能会导致空间泄漏。哪种代码会导致空间泄漏?如何检测到它们?程序员可以采取什么预防措施来避免这些预防措施?

最佳答案

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

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

然后,有时候,当适当的情况发生时,我做了类似的事情:
a <- takeMVar mvar
when (a > 10) ....

问题在于,mvar的内容本质上是(0 +1 + 1 +1 + ....)...对于100k之类的数字来说,这是相当密集的...这种类型的问题在我的代码中非常普遍;不幸的是,对于多线程应用程序,很容易陷入此类问题。

检测...我所做的是在产生有关内存消耗的数据的模式下启动haskell,启动和停止不同的线程,并查看内存占用量是否稳定...

Anotomy of a thunk leak (with instructions how to debug it)

例如:Thunk memory leak as a result of map function

10-04 12:36