C # Out of memory исключение - стратегия предупреждения - PullRequest
8 голосов
/ 01 февраля 2012

Внутри сложного многопоточного приложения я получаю исключения из нехватки памяти, возможно, один раз в неделю. Приложение отправляет / читает огромные объемы данных через несколько сокетов, где считанные данные кэшируются, чтобы избежать переполнения буфера сетевой карты.
Какова лучшая стратегия для анализа исключений памяти? Во время нормальной работы приложение отображается в обозревателе процессов размером «Всего байт во всех кучах» до 1,5 ГБ.
Может ли быть стратегией иметь поток, опрашивающий либо

GC.GetTotalMemory ()

или

PrivateMemorySize64 ()

раз в секунду, чтобы узнать, когда начинать анализировать вещи? Я еще не изучал коммерческие профилировщики, и меня немного беспокоит их влияние на производительность, которое также может дать неверные результаты в отношении анализа реальных проблем.

Ответы [ 4 ]

3 голосов
/ 01 февраля 2012

Ваша память, вероятно, фрагментирована из-за многочисленных строковых операций или других операций, которые создают и освобождают небольшие блоки памяти, такие как упаковка / распаковка.

Вы получите это исключение, когда CLR не сможет выделить достаточно большой свободный блок памяти.

Я использую «CLR Profiler» и проверяю распределение памяти. Если вы видите многочисленные белые пятна (свободные блоки) и нет больших свободных блоков, вам нужно начать смотреть на то, как вы распределяете объекты.

Например, перед тем, как присваивать одну строку другой, проверьте, отличаются ли строки в первую очередь. Использование StringBuilder - это все случаи, исключающие бокс и другие оптимизации памяти.

Я использую эту технику и полностью исключаю исключения, за исключением известной проблемы с двоичной десериализацией.

Откройте для себя утраченное искусство оптимизации памяти в управляемом коде в http://msdn.microsoft.com/en-us/magazine/cc163856.aspx

Исследование проблем с памятью при http://msdn.microsoft.com/en-us/magazine/cc163528.aspx

Оптимизация производительности в Visual Basic .NET при http://msdn.microsoft.com/en-us/library/aa289513(v=vs.71).aspx

1 голос
/ 01 февраля 2012

Возможно, вы захотите установить средства отладки для Windows и использовать adplus

ADPlus.vbs (ADPlus) - это инструмент из Службы поддержки продуктов Microsoft (PSS), который может устранять неполадкилюбой процесс или приложение, которое перестает отвечать (зависает) или дает сбой (происходит сбой).

По сути, вы можете настроить наблюдение за приложением, а при сбое оно будет записывать дамп, который затем можно будет проанализировать с помощью WinDBG / SOS.

1 голос
/ 01 февраля 2012

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

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

0 голосов
/ 01 февраля 2012

Как насчет использования слабых ссылок для кеширования? щелкающим

...