MSMQ BeginPeek / PeekCompleted утечка памяти - PullRequest
0 голосов
/ 22 июня 2010

При использовании Microsoft MessageQueue, похоже, произошла утечка памяти, связанная с событием PeekCompleted. Я нашел связанный вопрос об обмене экспертами с 2005 года, но без правильного ответа / решения: http://www.experts -exchange.com / Programming / Misc / Q_21387840.html

Используя ANTS Memory Profiler, я вижу, что я получаю дополнительные закрепленные экземпляры Byte [], Int32 [], System.Messaging.Interop.MQPROPVARIANTS [] и System.Threading.OverlappedData каждый раз, когда PeekCompleted срабатывает.

Цепочка ссылок: Byte []

Мы почти уверены, что мы правильно используем MSMQ и экспериментировали с разными вещами, такими как проверка наличия входящего объекта Message, явный вызов EndPeek и т. Д., Но не повезло. До сих пор не было написано простого кода, чтобы точно определить проблему, но, вероятно, это мой следующий шаг. Очевидно, есть вероятность, что мы используем его неправильно, но сейчас мы думаем, что на самом деле есть проблема с MSMQ. Утечка небольшая, но со временем она увеличивается.

У кого-нибудь есть идеи, как устранить эту утечку памяти? Подобные переживания?

1 Ответ

2 голосов
/ 16 февраля 2012

Убедитесь, что вы звоните BeginPeek только один раз. У нас также была эта проблема:

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

Наше решение : мы добавили счетчик рядом с каждым вызовом BeginReceive и счетчик в обработчике для полученных сообщений и обнаружили, что счетчик немного отличался после 10 000 сообщений (только на 12), но это достаточно, чтобы вызвать 500 МБ утечки памяти (комбинация закрепленных ручек и фрагментация памяти).

Почему мы пропустили ошибку изначально : она, похоже, не возникает в .Net v2, но возникла, когда мы перешли на .Net v4 в 64-битной среде с многопоточностью на многопроцессорной машине.

...