Настройка сборки мусора .NET - PullRequest
       8

Настройка сборки мусора .NET

2 голосов
/ 02 сентября 2010

У меня есть ситуация, когда GC не успевает удалить свободные объекты.Код загружает большой документ в память и обрабатывает его в цикле.Если я остановлюсь в этом цикле (в режиме отладки) или добавлю GC.Collect (), использование памяти упадет до менее чем 70 МБ.

Как настроить GC?Есть ли лучшие рекомендации по настройке GC?

Ответы [ 2 ]

3 голосов
/ 11 декабря 2012

Сначала вам нужно изучить, что происходит внутри сборщика мусора во время работы вашей программы. Обычно сборщик мусора хорошо решает, когда удалять объекты без вашего вмешательства. Тем не менее, это не подвержено ошибкам. Например, вы можете хранить список небольших объектов, содержащих ссылки на крупные объекты, которые, как вы ожидаете, скоро умрут. Чтобы понять узкие места в GC, вам нужно профилировать распределение памяти GC. Для этого ...

1) Поиск "монитора производительности" в Windows Start

2) На вкладке инструментов мониторинга выберите монитор производительности. Очистите все имеющиеся у вас счетчики с помощью «правого клика-> удалить все счетчики»

3) щелкните правой кнопкой мыши -> Добавить счетчики

4) Выберите все счетчики в разделе «.NET CLR memory». Когда вы добавляете их, убедитесь, что вы запускаете свою программу и выбираете программу из списка слева. Это гарантирует, что ваши счетчики будут сообщать о производительности вашей программы, но не о чем-либо еще

5) Как только вы запустите счетчики, пожалуйста, прочитайте следующие статьи, чтобы найти узкие места в вашей программе.

Основы сборщика мусора http://msdn.microsoft.com/en-us/magazine/bb985010.aspx

О чем говорят счетчики монитора производительности http://msdn.microsoft.com/en-us/library/x2tyfybc.aspx http://netrsc.blogspot.com.es/2008/01/net-clr-memory-performance-monitoring.html

Как только вы ознакомитесь с основами, поищите следующие вопросы 1) Куча больших объектов фрагментируется слишком быстро

2) Объекты, которые вы хотите быстро умереть, заканчиваются во втором поколении Например. кризис среднего возраста http://blogs.msdn.com/b/ricom/archive/2003/12/04/41281.aspx

3) Общее количество принятых байтов продолжает увеличиваться

4) Вы тратите слишком много времени на сбор мусора

5) и многое другое ... (проблемы с памятью в GC)

Поскольку вы не можете определить, какие объекты живут в разных поколениях, вы можете использовать что-то вроде профиля памяти ANST, чтобы увидеть, непреднамеренно ли вы продвигаете недолговечные объекты в поколение 2. Профилировщик позволяет вам видеть, кто содержит ссылки на большие объекты пик в различных хранилищах сборщика мусора (например, кто живет в поколении 2, кто живет, это куча больших объектов). Но перед выполнением какой-либо предварительной настройки производительности используйте монитор производительности Windows, чтобы определить, действительно ли ваши узкие места связаны с GC.

2 голосов
/ 02 сентября 2010

Лучший тюнинг здесь - это оставить его в покое.

Но если ваш процесс действительно постоянно блокирует сборщик мусора (это не должно происходить), это может помочь вызвать GC.Collect() после того, как завершит часть, занимающую память.

Но нам нужно гораздо больше информации здесь.Какой тип приложения, почему (как вы думаете) GC не имеет времени, чтобы сделать это нормально?

...