Очистка от восстановления памяти в .Net - PullRequest
2 голосов
/ 18 октября 2010

Я читал эту ссылку MSDN:

Хотя сборщик мусора способен отслеживать время жизни объекта который заключает в себе неуправляемый ресурс, он не имеет конкретного знание о том, как очистить ресурс. Для этих типов объектов, .NET Framework предоставляет Метод Object.Finalize, который позволяет объект для очистки своего неуправляемого ресурсы правильно, когда мусор Коллектор восстанавливает память, используемую предмет. По умолчанию финализировать метод ничего не делает Если вы хотите сборщик мусора для выполнения очистки операции над вашим объектом перед этим восстанавливает память объекта, вы должны переопределить метод Finalize в вашем класс.

Я понимаю, как работает GC, но это наводит меня на мысль, что на самом деле такое CleanUp? Это просто восстановление памяти, если это то, почему у него другое имя?

Ответы [ 5 ]

4 голосов
/ 18 октября 2010

Помните, что это еще не полная история, так как финализация происходит только тогда, когда объект собирается мусором. На самом деле вы должны освободить все неуправляемые ресурсы (дескрипторы файлов, мьютексы, неуправляемую память) как можно скорее. Вы должны взглянуть на интерфейс IDisposable, который определяет функцию Dispose().

По возможности ваш диспозитор должен запускать тот же метод для освобождения ресурсов, что и финализатор, но затем вызывать GC.SuppressFinalize(), чтобы остановить его повторный запуск (в финализаторе), так как при использовании объектов, которые реализуют, незначительное снижение производительности финализаторы.

3 голосов
/ 18 октября 2010

Они использовали общую фразу, такую ​​как «очистить», потому что другие вещи, возможно, должны быть сделаны помимо просто восстановления памяти.Я могу видеть, как это может немного сбивать с толку, поскольку в цитате упоминается очистка ресурсов и восстановление памяти в одном предложении.В этом случае они имеют в виду, что сборщик мусора восстанавливает память, используемую управляемым кодом, который фактически вызывается в неуправляемую библиотеку (например, класс-оболочку), но оставляет процесс восстановления, специфичный для неуправляемого,, разработчику (закрытиедескрипторы файлов, освобождающие буферы и т. д.).

Например, у меня есть библиотека-оболочка Graphviz, содержащая класс Graph.Этот класс объединяет функции, используемые для создания графов, добавления к ним узлов и т. Д. Внутренне этот класс поддерживает указатель на неуправляемую структуру графа, выделенную самим Graphiz.Для .NET Framework это просто IntPtr, и он не знает, как освободить его во время сборки мусора.Таким образом, когда управляемый объект Graph больше не используется, сборщик мусора освобождает память, используемую указателем, но не данные, на которые он указывает.Для этого мне нужно реализовать финализатор, который вызывает неуправляемую функцию agclose (функция Graphviz, которая высвобождает ресурсы, используемые графом).

1 голос
/ 18 октября 2010

Примером может быть, если вы написали компонент, который использовал некоторый ресурс операционной системы, такой как именованный канал или файл отображения памяти.Вы можете использовать операцию финализации, чтобы вернуть ресурс обратно в ОС.

0 голосов
/ 18 октября 2010

CleanUp здесь означает освобождение любого ограниченного ресурса (жесткого диска, пропускной способности сети, звуковой карты, памяти, процессора и т. Д.), А поскольку в .NET нет управляемой ссылки на неуправляемый код, он может просто позволить вам выполнить эту подходящий момент, используя метод Finalize(), прежде чем GC его поменяет. Если вы не наберете CleanUp, вы в конечном итоге получите неуправляемый код для неизвестного пользователя в неизвестном состоянии, в котором все еще используются ресурсы. Лучше реализовать IDisposable и CleanUp, вызвав Dispose() для вашего объекта.

0 голосов
/ 18 октября 2010

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

...