Воскрешение объекта


В объектно-ориентированных языках программирования со сборкой мусора воскрешение объекта — это когда объект возвращается к жизни в процессе уничтожения объекта , как побочный эффект выполнения финализатора .

Воскрешение объекта вызывает ряд проблем , в частности возможность воскрешения объекта — даже если оно не происходит — значительно усложняет и замедляет сборку мусора и является основной причиной, по которой финализаторы не рекомендуются. Языки имеют дело с воскрешением объектов по-разному . В редких случаях воскрешение объектов используется для реализации определенных шаблонов проектирования, в частности пула объектов , [1] , в то время как в других случаях воскрешение является нежелательной ошибкой, вызванной ошибкой финализаторов, и в целом воскрешение не рекомендуется. [2]

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

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

С воскресшим объектом можно обращаться так же, как с другими объектами, или с ним можно обращаться по-особому. Во многих языках, особенно в C#, Java и Python (начиная с Python 3.4), объекты финализируются только один раз, чтобы избежать повторного воскрешения или даже неуничтожимости объекта; в C# объекты с финализаторами по умолчанию финализируются только один раз, но могут быть повторно зарегистрированы для финализации. В других случаях воскрешенные объекты считаются ошибками, особенно в Objective-C; или обрабатываться идентично другим объектам, особенно в Python до Python 3.4.

Воскресший объект иногда называютобъект зомби илизомби, но этот термин используется для различных состояний объекта, связанных с уничтожением объекта, с использованием в зависимости от языка и автора. Однако «зомби-объект» имеет особое значение вObjective-C, которое подробно описано ниже. Объекты-зомби чем-то похожи напроцессы-зомбив том смысле, что они претерпели изменение состояния завершения и близки к освобождению, но детали существенно отличаются.