Утечка памяти в приложении asp.net - куча W3WP и gen 2 продолжает расти, пока AppPool не перезапустится - PullRequest
4 голосов
/ 23 июля 2010

У нас есть большое приложение asp.net с утечкой памяти. Perfmon показывает, что эта утечка находится в управляемой памяти, поскольку частные байты W3WP растут с той же скоростью, что и байты во всех кучах. Я также вижу, что сборки мусора Gen 2 запущены, но размер кучи Gen 2 продолжает расти.

Я взял дамп памяти и проанализировал в WinDbg и вижу очень большое количество объектов разных типов. Строки - самый большой тип, и 20% размера строк состоит из 51 объекта.

Вывод этих больших строк показывает вывод html либо из элементов управления, либо из целых страниц. При запуске! Gcroot для них показаны корневые объекты типа System.Text.RegularExpressions.Regex или System.Web.RegularExpressions.GTRegex.

Есть идеи о том, что может происходить или как я могу продолжить расследование?

Спасибо, Саймон

Ответы [ 3 ]

2 голосов
/ 23 июля 2010

То, что строки являются самым распространенным типом в вашей куче, совсем не странно.Если, например, у вас есть 10 HashSet, содержащих по 1000 строк в каждой, дамп покажет, что у вас есть 10 HashSet в вашей куче, но 100 000 строк.Многие объекты содержат одну или несколько строк.Таким образом, число строк, показанных в дампе, представляет собой сумму всех строк из всех объектов в куче, которые, как правило, много.

Однако, если у вас много System.Text.RegularExpressions.Regexв вашей куче, это может быть корнем ваших проблем с памятью.Регулярные выражения в .NET, как правило, занимают много ресурсов.Поэтому я советую вам пройтись по своему коду и попытаться найти какое-либо чрезмерное использование регулярных выражений.Кроме того, убедитесь, что все ссылки на объекты Regex обрабатываются, то есть, что ссылки на объекты Regex не поддерживаются.Таким образом сборщик мусора может убедиться, что объекты Regex правильно освобождены.

Удачи!

2 голосов
/ 23 июля 2010

Как насчет использования профилировщика памяти, такого как dotTrace Memory или ANTZ Memory Profiler ?Оба продукта доступны в виде пробной версии с ограниченным сроком действия.

0 голосов
/ 23 июля 2010

В теории должно быть довольно сложно вызвать утечку памяти в asp.net без использования неуправляемых ресурсов. Если все является однопоточным, тогда все ссылки на управляемые ресурсы должны быть свободны для сбора мусора после завершения жизненного цикла страницы. Вы запускаете рабочие потоки, чтобы что-то сделать, и эти потоки продолжают жить после жизни страницы? Или у вас есть какие-либо длительно запущенные процессы, представленные в виде веб-методов, которые могут запускаться асинхронно и требуют много времени для запуска и повторного вызова, пока память не заполнится?

...