MSMQ BeginPeek/PeekCompleted утечка памяти
При использовании 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[]
1 ответ
Убедитесь, что вы звоните только BeginPeek
один раз. У нас также была эта проблема:
Наша проблема: у нас была та же утечка памяти из-за очень маленького состояния гонки в нашем коде, которое иногда приводило к вызову BeginReceive
дважды. Это было трудно отследить, и мы действительно обнаружили это случайно, когда сравнивали производительность перезаписи, которая устранила проблему с исходным кодом.
Наше решение: мы добавили счетчик рядом с каждым вызовом BeginReceive и счетчик в обработчике для полученных сообщений и обнаружили, что после 10000 сообщений (только на 12) счетчик немного отличается (но этого достаточно, чтобы вызвать утечку памяти в 500 МБ). сочетание закрепленных ручек и фрагментации памяти).
Почему мы изначально пропустили ошибку: она, похоже, не возникает в.Net v2, но появилась, когда мы перешли на.Net v4 на 64-битной базе данных с многопоточностью на многопроцессорной машине.