2012-02-20 22 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#的這個開源版本),但也許它可以幫助你找到泄漏的來源或證明它實際上是在泄漏記憶。

希望幫助某種程度上可能?

託尼