Утечки памяти в Microsoft.FSharp.Control.Mailbox?

Я сейчас нахожусь в поиске утечек памяти в длинном сервисе (использующем F#). Единственная "странная" вещь, которую я видел до сих пор, - это следующее:

  • Я использую MailboxProcessor в подсистеме с алгебраическим типом данных с именем QueueChannelCommands (более или менее набор команд Add/Get - некоторые с присоединенным AsyncReplyChannels)
  • когда я профилирую службу (используя Ants Memory Profiler), я вижу экземпляры массивов упомянутого типа (большинство из которых имеют длину 4, но растут) - все пустые (нулевые), чьи ссылки, по-видимому, хранятся в Control.Mailbox:

Я не вижу никакой причины в моем коде для такого поведения (ваш стандартный код, который вы можете найти в каждом примере с почтовым ящиком - просто цикл с let! = receive и match следовать закончилась с return! loop()

Кто-нибудь видел такое поведение раньше или даже знает, как с этим справиться? Или это даже (известная) ошибка?

Обновление: рост массивов действительно странный - кажется, что есть дополнительное пространство, добавленное без должного использования:

2 ответа

Я ни в коем случае не эксперт по F#, но, возможно, вы можете посмотреть на первый ответ в этой теме:

Есть ли у Async.StartChild утечка памяти?

Первый ответ упоминает учебник по профилированию памяти на следующей странице:

Но они упоминают эту версию F# с открытым исходным кодом

И я не уверен, что это то, что вы ищете (об этой версии F# с открытым исходным кодом в последнем пункте), но, возможно, это может помочь вам найти источник утечки или доказать, что это действительно утечка памяти.

Надеюсь, что это может как-то помочь?

Тони

.NET имеет свой собственный сборщик мусора, который работает довольно хорошо. Наиболее распространенный способ вызвать утечки памяти в технологиях.NET - это создавать делегаты, а не удалять их в деконструкторах объектов.

Другие вопросы по тегам