Haskell中的空间泄漏

mis*_*tor 18 haskell functional-programming lazy-evaluation space-leak

我已多次读过Haskell中的懒惰评估有时会导致空间泄漏.什么样的代码会导致空间泄漏?如何检测它们?并且程序员可以采取哪些预防措施来避免它们?

ond*_*dra 12

您可能会得到许多回答,这是我在尝试做一些"真实世界"的应用程序时遇到的问题.我使用多线程和一些MV来传递数据(MVar就像锁定共享内存).我的典型模式是:

a <- takeMVar mvar
putMVar mvar (a + 1)
Run Code Online (Sandbox Code Playgroud)

然后,有时候,当一个适当的条件发生时,我做了类似的事情:

a <- takeMVar mvar
when (a > 10) ....
Run Code Online (Sandbox Code Playgroud)

问题是mvar的内容基本上是(0 + 1 + 1 + 1 + ....)......对于像100k这样的数字而言非常密集......这种类型的问题在我的代码中非常普遍; 不幸的是,对于多线程应用程序来说,很容易遇到这样的问题.

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

thunk泄漏的解剖(有说明如何调试)

一个例子:由于map函数导致的Thunk内存泄漏