Microsoft.FSharp.Control.Mailbox中的内存泄漏问题?

26

我正在查找一个长时间运行的服务(使用F#)中的一些内存泄漏问题。

目前唯一“奇怪”的事情是:

  • 我在一个名为QueueChannelCommands的代数数据类型子系统中使用一个MailboxProcessor(大多数是一些带有AsyncReplyChannels附加的Add/Get命令)
  • 当我使用Ants Memory Profiler对服务进行分析时,我看到了此类型数组的实例(大多数长度为4,但在增长)-所有实例都是空的(null),其引用似乎由Control.Mailbox保持: enter image description here

我无法在我的代码中看到这种行为的原因(你可以在任何Mailbox示例中找到标准代码 - 只是一个循环与let!= receive和一个matchreturn! loop()结束。

是否有人曾经见过这种行为,甚至知道如何处理它? 这是否是已知的错误?

更新:数组的增长确实很奇怪-似乎附加了未被正确使用的其他空间: enter image description here


如果有帮助的话,该数组似乎是MailboxProcessor的内部“mailbox.arrivals”。 - Random Dev
1
Dave Thomas注意到当他在try/catch块中使用return! loop()时出现了类似的行为:http://moiraesoftware.com/blog/2011/12/11/fixing-a-hole/。我不认为这是你的程序的情况。 - pad
是的,谢谢 - 我知道这个问题,但这导致了更多的开销(他发现很多异步的东西),就像使用 do! 而不是 return! 一样 - 在这里我只看到增长的、空的数组,没有任何异步问题。 - Random Dev
4
你能提供一些能够复现问题的代码吗? - J D
经过对生产服务进行24小时的分析,主要问题似乎是另一个问题(请参见此处:https://dev59.com/VGDVa4cB1Zd3GeqPfqsa)-我之前只在我的测试机上测试了几分钟到大约1小时,并且只查看了带有源代码的对象(因此是我自己做的东西)。从大局来看,数组似乎会增长一点(我仍然不认为每个处理器上会同时有多达300条消息),但这些kb与那些讨厌的byte[]东西的MB相比微不足道...抱歉! - Random Dev
显示剩余3条评论
2个回答

2

我并不是F#专家,但也许你可以看看这个帖子中的第一个答案:

Does Async.StartChild have a memory leak?

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

但他们提到了这个开源版本的F#:

我不确定它是否符合您的要求(关于最后一点中的这个开源版本的F#),但也许它可以帮助您找到内存泄漏的源头或证明它确实存在内存泄漏。

希望这些信息能对您有所帮助。

Tony


-6

.NET有自己的垃圾回收器,效果很不错。 在.NET技术中导致内存泄漏最常见的方式是设置委托,并在对象析构函数中未将其移除。


我认为可以相当安全地假设问题的提问者已经知道这些,从问题中可以看出。此外,你的回答与MailboxProcessor没有任何关系,甚至与特定问题(数组及其增长)更无关联。 - ShdNx
实际上我认为这是加法:如果MailboxProcessor的实现没有做任何事情,那么就不会有任何事件被连接(我猜这就是意思)。 - Random Dev
这只是关于.NET中内存泄漏管理的一个小注释。 - Mihai Popescu
这只是关于.NET中内存泄漏管理的一个小评论。如果没有帮助到您,对不起,但也许您用了错误的方式去寻找内存泄漏。也许您在委托类似的方法上分配内存,并且当您销毁这些对象时,该内存不会被释放。我不是F#的粉丝,所以我不知道它的内部情况,但我做了很多内存泄漏猎手的工作,如果我没有在委托类似的方法上分配内存,那么.NET的东西总是无泄漏的。 - Mihai Popescu

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