2009-05-29 2 views
13

Существует несколько способов, которые разработчики могут получить от непреднамеренных утечек ресурсов в .NET. Я думал, что было бы полезно собрать их в одном месте..NET Resource Leak Gotchas

Пожалуйста, добавьте ваше с одним ответом на изделие, поэтому лучше всего прибудет проголосовал :)

+1

Связанные должности: http://stackoverflow.com/questions/20386/memory-leaks-in-net –

+2

не должны ли это быть Community Wiki!?!? –

+2

Нет на CW - пусть он будет вознагражден за постановку вопроса. Холодный вопрос, кстати. – ine

ответ

6

Покидая соединения с базой данных открытыми.

4

Неспособность реализовать Утилизируйте и не удаляйте дочерние объекты.

+1

Или, реализуя его, а не помещая код в блок «Использование». –

+1

Или реализуйте Dispose, но не добавляя Finalizer, который вызывает Dispose. –

0

Олицетные ручки маркера слева открыты.

7

P/Вызов неуправляемого кода, а не его очистка или не реализация IDisposable для их очистки.

8

Неисправность обработчиков событий.

Регистрация на событие должно быть в паре с отмены регистрации:

this.myObject.MyEvent += new EventHandler(myObject_MyEvent); 
    this.myObject.MyEvent -= new EventHandler(myObject_MyEvent); 

Существует пример системы, где это произошло на CodeProject.

1

Неисправность метода «Закрыть» в объекте System.Windows.Window.

Единственный способ гарантировать, что все управляемые ресурсы для объекта System.Windows.Window собираются в мусор, - это вызов метода Close() в объекте Window. Вызов Dispose или установка ссылки на объект на null не приведет к уничтожению объекта.

+0

Можете ли вы привести цитату из этого? –

+0

@John: Это было найдено моим коллегой во время охоты за утечками ресурсов, поэтому у меня нет опубликованной справки. –

1

Если вы считаете управляемую память как «ресурс» - не удается отменить обработчики событий, это общий источник утечек памяти (и других других более серьезных ошибок).

+0

Управляемая память не является ресурсом, но подписки на события. – supercat

1

Статические списки, словари и сборные ресурсы, которые заполняются за пределами кода запуска.

Это может произойти, если у вас есть словарь, который вы используете как глобальный кеш, вместо правильного кэша на основе LRU.

Для чего-то Статический требует особого внимания!

2

Практически все при использовании API-интерфейсов Office. Поскольку они все COM-объекты, они должны быть удалены. Вам также необходимо сохранить ссылку на класс, если вы хотите использовать обработчики событий, иначе они потеряют свою ссылку. Во многих случаях вам даже нужно вручную вызвать GC для очистки объектов.

4

Объекты клиента WCF не работают, как другие объекты IDisposable. Клиент службы WCF должен быть прерван, если операция находится в неисправном состоянии, иначе он будет закрывать соединение. Обычно это усложняется.

+0

WCF сжег меня с аналогичной проблемой в последнее время. Я опубликую его, но это связано с вызовом Dispose на заводе - который реализует IDispose! –

2

Использование метода WeakReference может привести к тонкой утечке, когда объект, удерживаемый WeakReference, очищается, потому что у него нет сильных ссылок, но сам WeakReference не потому, что вы держите на нем сильную ссылку.

Вы можете столкнуться с этим, если у вас есть что-то вроде списка или словаря WeakReferences, который вы никогда не обрезаете. Вы закончите утечку объектов WeakReference даже после того, как цель будет собрана.

0

Невозможно утилизировать любые объекты, связанные с рисунком (Graphics, Font, SolidBrush, Pen и т. Д.) На .NET Compact Framework. Это может привести к серьезным утечкам памяти, когда вы не хотите (мобильное устройство = ограниченная память).

1

Простая утечка памяти: создайте статическое поле в классе типа List. Добавить элементы в список. Они никогда не будут собирать мусор, поэтому, если вы не забудете вручную удалить свои предметы, когда закончите с ними, память будет постоянно привязана.

0

Неправильная конфигурация Spring.NET создать несколько экземпляров, что должно быть одноэлементно.