2012-04-06 4 views
0

Как им чтение через 3 книги о GC, IVE уведомления какой-то странный факт:C# компиляция метода завершения работы во время выполнения?

C# с помощью CLR

CriticalFinalizerObject: в CLR трактует этот класс и классы производные от него совершенно особым образом

enter image description here

что ???

«не найти достаточно памяти для COMPILE метод?« ИМХО - код должен быть уже скомпилирован ... нет?

Когда я пишу C# код - весь код скомпилирован в IL до его запуска ... нет? , но по тексту - в RUNTIME - он МОЖЕТ найти недостаточно памяти для компиляции ...

Помощь?

+0

Это прекрасно объясняет, почему Finalize не гарантируется выполнение, так что не паникуйте легко :) –

ответ

5

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

Объект, полученный из CriticalFinalizerObject, имеет свой финализатор, скомпилированный немедленно, поэтому для его выполнения при выгрузке программы не требуется дополнительной памяти. Это для объектов, которые должен иметь свой финализатор, выполненный, если это вообще возможно (независимо от выключения питания или аналогичного)

+0

В какой ситуации ДОЛЖЕН ДОЛЖЕН ДОЛЖЕН быть финишер для запуска? финализаторы предназначены для неуправляемых ресурсов, которые WILL (в конечном итоге) будут восстановлены, когда ОС вернет свой контроль ... –

+1

Во время остановки процесса нет причин. Это имеет смысл в среде, где используются многие приложения AppDomains и время от времени выгружается, как веб-сервер. Это помогает пережить серверный процесс дольше, если и только если appdomain не освобождается из-за необработанного освобождения. –

+0

@AloisKraus 'помогает пережить серверный процесс дольше' Я не вижу всю картину. Прости. скажем, у меня есть домены приложений A, B, C, D. что «CriticalFinalizerObject» помогает мне здесь (работает «CriticalFinalizerObject») Мне нужен пример реальной жизни, чтобы я мог понять, а не определение книги.Можете ли вы ответить? –

2

Я думаю, что это бэкэнд из «Компилятора». От ИЛ до машинного кода.

+0

You должен сказать JIT-компилятор, чтобы быть более конкретным. –

1

С компилятором является компилятор JIT, предназначенный для компиляции ваших методов финализатора с нетерпением и не задерживать его компиляцию незадолго до его выполнения.

Более глубокая причина этого заключается в том, что эти финализаторы вызывается при завершении работы приложения после выполнения всех нормальных финализаторов. Но CLR выполняет все ожидающие финализаторы с таймаутом в 2 секунды (по крайней мере, это было с .NET 2.0, которые не проверялись с тех пор). Затем выполняются критические финализаторы.

Критический финализатор имеет редкое применение, например. для ручек, которые необходимо закрыть в любом случае. Но вы также можете использовать их для хранения ресурсов до тех пор, пока не будут выполнены все финализаторы для включения, например, tracing even inside finalizers.

Смежные вопросы