Корни сборщика мусора и локальные переменные
-
29-10-2019 - |
Вопрос
При просмотре документации по таймеру Я наткнулся на следующий пример с этим комментарием:
родовое словоОзначает ли это, что сборщику мусора в C # разрешено собирать мусор локальные переменные, даже если это будет иметь побочные эффекты?Предположительно, потому что я больше не обращаюсь к таймеру после этого, GC может собрать его раньше?
Не уверен, что я поклонник такой оптимизации, если я правильно это понимаю (но тогда я, вероятно, не знаю;))
Решение
Да, GC может собирать локальную переменную перед окончанием объема, как только после последнего использования переменной.Помещение gc.eepalive в конце метода гарантирует, что переменная будет «живой» до тех пор, пока звонок Keepalive.
C # является императивным языком, поэтому GC не был разработан, чтобы узнать что-либо о побочных эффектах.
Другие советы
Насколько я понимаю GC, он будет отмечать любую переменную или объект, который он считает, больше не нужен в качестве кандидата для сборки мусора во время следующего цикла GC.Я не уверен, что я понимаю конкретное приложение здесь, но я знаю, что есть случаи, когда GC может отметить ресурс для сбора, когда он все еще нужен (но не отображается так из-за того, что код написан). .
Обычно во время методов объекта или переменной остаются в области применения в течение продолжительности вызова метода, но если этот метод будет длиться дольше, чем время между циклами GC, GC может увидеть ваш объект таймера как вне области применения и отметкиЭто для сбора.Добавление метода gc.eepalive заставляет GC ждать до тех пор, пока метод не выходит перед выступлением на объект таймера.