2009-05-15 1 views
3

У меня есть большое приложение .NET C# с утечкой памяти. Используя профилировщик памяти муравьев, я вижу, что в памяти есть несколько версий одинаковых пользовательских элементов управления, и сборщик мусора не собирает их. Существует кэширование выходных данных в веб-формах, но нет кэширования выходных данных в реальных пользовательских элементах управления.Почему пользовательские элементы управления не собираются коллекционером Gargabe?

Есть ли причина, по которой пользовательские элементы управления не удаляются?

Как я могу определить, почему и что удерживает их от утилизации сборщиком мусора?

ответ

0

В основном объект не будут собраны, если кто-то держит, по крайней мере одну ссылку на него. Посмотрите и найдите, кто держит ссылку. ANTS Profiler или .NET Memory Profiler (SciTech) даст хорошее представление.

1

Существует множество причин, по которым пользовательский контроль не является сборкой мусора. Посмотрите на сам код, вы создаете объекты (такие как наборы записей), которые реализуют IDisposable, на котором вы фактически не распоряжаетесь?

0

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

http://msdn.microsoft.com/en-us/library/k4he1ds5(VS.71).aspx