[Обновление - 30 сентября 2010 г.]
Поскольку я много изучал эту и смежные темы, я напишу любые советы, которые я собрал из своего опыта и предложений, приведенных в ответах здесь-
1) Используйте профилировщик памяти (для начала попробуйте CLR Profiler) и найдите подпрограммы, которые используют max mem, и настройте их, например, повторно используйте большие массивы, старайтесь сводить ссылки на объекты к минимуму.
2) Если возможно, выделите небольшие объекты (менее 85 КБ для .NET 2.0) и используйте пулы памяти, если вы можете избежать высокой загрузки ЦП сборщиком мусора.
3) Если вы увеличите ссылки на объекты, вынесем ответственность за то, чтобы прекратить ссылаться на них одинаковое количество раз.У вас будет душевное спокойствие, и код, вероятно, будет работать лучше.
4) Если ничего не работает, и вы все еще не знаете, используйте метод исключения (код комментария / пропуска), чтобы узнать, что потребляет больше всего памяти.
Использование счетчиков производительности памяти внутри вашего кода также может вам помочь.
Надеюсь, что это поможет!
[Оригинальный вопрос]
Привет!
Я работаю в C #, и моя проблема не связана с памятью.
Я прочитал отличную статью о LOH здесь -> http://www.simple -talk.com / dotnet /.net-framework / куча опасностей большого объекта /
Потрясающе читать!
А, http://dotnetdebug.net/2005/06/30/perfmon-your-debugging-buddy/
Моя проблема:
Я сталкиваюсь с проблемой нехватки памяти в настольном приложении уровня предприятия.Я пытался прочитать и понять материал о профилировании памяти и счетчике производительности (пробовал также WinDBG! - немного), но все еще не разбираюсь в элементарных вещах.Это было полезно в:
Показывая, кто выделил огромные куски памяти
Какой тип данных использовал максимальный объем памяти
Но и CLR Profiler, и счетчики производительности (поскольку они совместно используют одни и те же данные) не смогли объяснить:
Числа, которые собираются после каждого запуска приложения -как понять, есть ли какое-либо улучшение?!?!
Как сравнить данные производительности после каждого запуска - меньше или меньше число конкретного счетчика, хорошо или плохо?
Что мне нужно:
Я ищу советы по:
Какосвободить (да, верно) управляемые объекты типа данных (например, массивы, большие строки) - но не путем вызовов GC.Collect, если это возможно.Мне приходится обрабатывать массивы байтов длиной, например, 500 КБ (неизбежный размер :-() время от времени.
Если происходит фрагментация, как сжимать память - как кажется, что .NETGC на самом деле не делает этого эффективно и вызывает OOM.
Кроме того, что такое ограничение 85 КБ для LOH? Это размер объекта общего размера массива? Этомне не очень понятно.
Какие счетчики памяти могут подсказать, действительно ли изменения кода уменьшают шансы OOM?
СоветыЯ уже знаю
Установить для управляемых объектов значение null - пометить их как мусор - чтобы сборщик мусора мог их собрать. Это странно - после установки string [] объект в ноль, # байт во всех кучах взлет!
Избегать создания объектов / массивов> 85 КБ - это не в моем контроле. Итак,может быть много LOH.
3.
Memory Leaks Indicators:
# bytes in all Heaps increasing
Gen 2 Heap Size increasing
# GC handles increasing
# of Pinned Objects increasing
# total committed Bytes increasing
# total reserved Bytes increasing
Large Object Heap increasing
Моя ситуациянация:
- У меня есть 4 ГБ, 32-разрядный компьютер с Wink 2K3 сервером SP2.
- Я понимаю, что приложение может использовать <= 2 ГБ физической ОЗУ </li>
- Увеличение размера виртуальной памяти (файла подкачки) в этом сценарии не влияет.
В связи с проблемой OOM я сосредоточился только на счетчиках, связанных с памятью.
Пожалуйста, совет! Мне действительно нужна помощь, потому что я застрял из-за отсутствия хорошей документации!