2012-02-20 93 views
26

我在捉对长期乳宁服务的一些内存泄漏(使用F#)现在。 迄今为止我见过的唯一的“奇怪”的事情是这样的:Microsoft.FSharp.Control.Mailbox中的内存泄漏?

  • 我在一个子系统使用MailboxProcessor用代数据类型命名QueueChannelCommands(或多或少一堆添加/ Get命令 - 一些附带AsyncReplyChannels)
  • 当我配置文件中的服务(使用蚂蚁内存分析器),我看到上述类型的数组的情况下(最有lenght 4,但越来越多) - 所有空(NULL),其引用似乎被控制举行。邮箱: enter image description here

我看不到任何reas在我对这种行为的代码(你的标准代码,你可以在每一个邮箱,例如找出存在 - 只是一个let! = receivematch环路遵循一个return! loop()

结束前或有没有人见过这种行为甚至知道如何处理这个? 或者这甚至是(已知的)错误?

更新:数组的成长真的很奇怪 - 好像有没有beeing正确使用附加额外的空间: enter image description here

+0

数组似乎是MailboxProcessor的内部“mailbox.arrivals”如果这是任何帮助 – Carsten 2012-02-20 06:05:23

+1

戴夫·托马斯发现了类似的行为时,他用'回报! loop()'在try/catch块中:http://moiraesoftware.com/blog/2011/12/11/fixing-a-hole/。我不认为你的程序就是这种情况。 – pad 2012-02-20 07:15:42

+0

是的,谢谢 - 我意识到这个问题,但这导致了更多的开销(他发现了很多异步的东西),类似于什么时候做的!而不是回报!被使用 - 在这里我只看到越来越多的空阵列,没有任何异步问题。 – Carsten 2012-02-20 07:41:10

回答

-5

.NET拥有自己的垃圾收集器,它很好地工作。 导致内存泄漏在.NET技术最常见的方式是通过建立代表,而不是对象deconstructors删除它们。

+0

从问题来看,我认为这是相当安全的,假设提问者知道这些。此外,您的答案与MailboxProcessor无关,甚至更少的特定问题(数组及其增长)。 – ShdNx 2012-03-21 13:23:43

+0

事实上,我确实加了一句:如果MailboxProcessor的实现没有做任何事情,那么在这里没有任何事件(我想这就是什么意思) – Carsten 2012-03-22 05:04:09

+0

这只是一个关于.NET中的内存泄漏管理的小小评论。 – 2012-03-26 08:39:12

2

我没有以任何方式一个F#专家,但也许你可以看看这个线程的第一个答案:

Does Async.StartChild have a memory leak?

的第一个答复提到了以下页的内存分析教程:

但他们提到这个开源已经F#的rsion

而且我不知道这是你在找什么(关于最后一点F#的这个开源版本),但也许它可以帮助你找到泄漏的来源或证明它实际上是在泄漏记忆。

希望帮助某种程度上可能?

托尼