Дескриптор завершения остается в памяти. как убрать эту ссылку?
Мне нужно оптимизировать мое приложение в использовании памяти. поэтому я использовал профилировщик производительности.net... но некоторые ссылки в моем приложении все еще живы и никогда не собираются GC, даже если я заставляю его собирать.
Ссылка, которая является действующей, является типом "дескриптора финализации". Я не знаю, что делать, чтобы удалить ссылку такого рода.... пожалуйста, помогите.
1 ответ
Это не утечка памяти, а просто неаккуратное кодирование со стороны автора (ов) AMProLibrary.
Как вы заметили, профилировщик сообщает вам, что указанный объект имеет тип "Дескриптор финализации". Это означает, что он поступает из очереди финализатора. Очередь финализатора - это то, что сборщик мусора.NET использует для хранения всех объектов, которые реализуют метод финализатора. Финализатор - это механизм, который обеспечивает правильное освобождение неуправляемых ресурсов во время сборки мусора. Объект, который содержит неуправляемые ресурсы, реализует IDisposable
шаблон, в том числе Finalize
метод, в котором освобождаются неуправляемые ресурсы. Когда сборщик мусора обрабатывает "финализуемые" объекты (как указано значением бита в заголовке объекта), он перемещает их в очередь финализатора. Во время сбора GC перебирает очередь финализатора и вызывает Finalize
метод на каждом из этих объектов.
То, что автор библиотеки явно не смог сделать, это позвонить GC.SuppressFinalize()
изнутри Dispose
метод. Обычно это удаляет объект из очереди финализатора путем очистки "финализируемого" бита в заголовке объекта и указывает, что Finalize
метод не нужно вызывать.
В целях тестирования вы можете принудительно запустить финализаторы, вызвав GC.WaitForPendingFinalizers
функция. Например:
System.GC.Collect();
System.GC.WaitForPendingFinalizers();
System.GC.Collect();
Однако вы не должны использовать подобный код в производственном приложении. Форсировать коллекцию редко имеет смысл. Это только докажет обоснованность гипотезы, изложенной выше.
В общем случае не следует полагаться на финализатор для освобождения неуправляемых ресурсов. Все объекты, которые реализуют IDisposable
должны быть явно удалены вашим кодом, либо вручную вызвав Dispose
метод или, предпочтительно, оборачивая их создание в using
блок, который будет автоматически вызывать Dispose
когда выход из области блока.