.method family hidebysig virtual instance void
Finalize cil managed
{
.override [System.Runtime]System.Object::Finalize
// Code size 17 (0x11)
.maxstack 1
.try
{
IL_0000: call void [System.Console]System.Console::Beep
IL_0005: nop
IL_0006: leave.s IL_0010
} // end .try
finally
{
IL_0008: ldarg.0
IL_0009: call instance void [System.Runtime]System.Object::Finalize
IL_000e: nop
IL_000f: endfinally
} // end handler
IL_0010: ret
} // end of method MyResourceWrapper::Finalize
Тестирование класса MyResourceWrapper
using System;
using SimpleFinalize;
Console.WriteLine("***** Fun with Finalizers *****\n");
Console.WriteLine("Hit return to create the objects ");
Console.WriteLine("then force the GC to invoke Finalize");
// Нажмите клавишу
// и затем заставить сборщик мусора вызвать метод Finalize
// В зависимости от мощности вашей системы
// вам может понадобиться увеличить эти значения.
CreateObjects(1_000_000);
// Искусственно увеличить уровень давления.
GC.AddMemoryPressure(2147483647);
GC.Collect(0, GCCollectionMode.Forced);
GC.WaitForPendingFinalizers;
Console.ReadLine;
static void CreateObjects(int count)
{
MyResourceWrapper[] tonsOfObjects =
new MyResourceWrapper[count];
for (int i = 0; i < count; i++)
{
tonsOfObjects[i] = new MyResourceWrapper;
}
tonsOfObjects = null;
}
На заметку!
Единственный способ гарантировать, что такое небольшое консольное приложение принудительно запустит сборку мусора в .NET Core, предусматривает создание огромного количества объектов в памяти и затем установит ссылку на них в null. После запуска этого приложения не забудьте нажать комбинацию клавишПодробности процесса финализации
Важно всегда помнить о том, что роль метода Finalize
Finalize по той простой причине, что финализация занимает время.При размещении объекта в управляемой куче исполняющая среда автоматически определяет, поддерживает ли он специальный метод Finalize
Когда сборщик мусора решает, что наступило время высвободить объект из памяти, он просматривает каждую запись в очереди финализации и копирует объект из кучи в еще одну управляемую структуру под названием таблица
Finalize на каждом объекте из упомянутой таблицы Подводя итоги, следует отметить, что хотя финализация объекта гарантирует ему возможность освобождения неуправляемых ресурсов, она все равно остается недетерминированной по своей природе, а из-за незаметной дополнительной обработки протекает значительно медленнее.
Бьёрн Страуструп , Ирина Сергеевна Козлова , Бьерн Страуструп , Валерий Федорович Альмухаметов
Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT