Эфемерон

Эфемерон это структура данных, которая решает две связанные проблемы в системах сбора мусора . С одной стороны, эфемерон предоставляет уведомление, когда какой-то объект собирается быть собранным. С другой стороны, эфемерон позволяет связывать данные с каким-то объектом, не создавая ссылку на этот объект, которая помешает сбору объекта. Эфемерон — это пара ключ-значение, где ключ — это объект, который эфемерон охраняет, уведомляя систему, когда этот объект может быть собран, а значением могут быть любые данные, связанные с объектом, такие как список свойств, и которые могут быть пустыми. Поскольку элементы списка свойств могут ссылаться на ключ, они могут помешать сбору этого ключа. Но эфемерон обрабатывается сборщиком мусора особым образом. Поле значения не отслеживается, пока не будет обнаружено, что ключ доступен из корней системы, кроме как через ключи эфемерона. Набор эфемеронов, ключи которых доступны только из ключей эфемерона, затем удерживает ключи, которые готовы к сбору; Эти объекты не могут быть достигнуты из корней, кроме как через эфемероны. Когда сборщик мусора обнаруживает такой набор, эфемероны ставятся в очередь для уведомления, а их ключи и значения отслеживаются. Таким образом, эфемероны обнаруживают объекты, готовые к сбору, и разрывают циклы, которые могут помешать сбору объектов.

Описание

В информатике финализация происходит, когда сборщик мусора (GC) сообщает приложению, что объект «почти поддается сбору». Она используется, чтобы помочь приложению поддерживать свои инварианты . Слабые ссылки могут использоваться сборщиком мусора для определения объектов , которые почти поддаются сбору. Рассматриваемые как пары ключ-значение, основное различие между слабыми ссылками и эфемеронами заключается в том, как сборщик мусора обрабатывает их. Для слабых ссылок сборщик мусора всегда следует значению в паре ключ-значение. Для эфемеронов, вместо этого, сборщик мусора не следует значению, а ставит эфемерон в очередь для дальнейшего наблюдения на втором этапе: после завершения первой фазы трассировки он проходит по очереди, просматривая каждый эфемерон, и если его ключ был замечен, то он следует его значению. Это тонкое различие влияет на графы с некоторыми видами циклов, где слабые пары не описывают правильно, что объект должен быть «почти поддающимся сбору». Например, рассмотрим пару ключ-значение со слабыми ссылками, где ключ — это объект, а значение — это набор свойств, прикрепленных к объекту. Ожидается, что когда объект будет готов к сбору, свойства также исчезнут. Но если значение, возможно транзитивно, сопоставляется со своим собственным ключом (объектом), то объект никогда не будет собран. Если бы вместо этого использовался эфемерон, значение не отслеживалось бы, если бы объект не был доказан как живой, решая цикл. Эфемероны похожи на слабые пары, но объект в ключевом поле эфемерона может быть классифицирован как «почти собираемый», даже если он доступен из полей значений эфемерона. [1]

Использует

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

свойство --------- реестр --------- ассоциация --------- объект

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

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

История

Эфемероны были впервые изобретены Джорджем Босвортом, когда он работал в Digitalk. [1] Они использовались в качестве механизма финализации в Visual Smalltalk Enterprise . Сегодня эфемероны доступны в большинстве диалектов Smalltalk , а также во многих других языках с автоматической сборкой мусора.

Примеры использования

Smalltalk

Несколько диалектов Smalltalk включают эфемероны как встроенные функции или как дополнительные пакеты. Например, GNU Smalltalk [2] и Squeak . [3]

Луа

Lua не содержит отдельной конструкции эфемерона, но его структуры данных таблиц могут быть установлены для хранения его ключей, значений или и того, и другого слабым образом. Если ключи удерживаются слабо, а значения удерживаются сильно, таблица будет вести себя как эфемерон. Lua 5.4 также вводит метатабличное поведение, которое помогает строить структуры данных, подобные эфемеронам. [4]

.СЕТЬ

Такие языки, как C# , F# и VB.NET , начиная с .NET Framework 4.0, поддерживают класс ConditionalWeakTable. [5] Базовый механизм эфемеронов (DependentHandle) был закрытым до .NET 6.

OCaml

Реализация типа эфемерона OCaml была представлена ​​в 2014 году [6] и добавлена ​​в стандартную библиотеку в версии 4.03. [7]

Ракетка

Диалект Racket языка Lisp поддерживает эфемероны в своей системе выполнения. Там эфемероны используются в сочетании со слабыми отображениями, чтобы позволить сборщику мусора освобождать пары ключ-значение, даже если значение содержит ссылку на ключ. [8]

Схема СРФИ

SRFI ( Scheme Request for Implementation ) определяет API для эфемеронов для языка Scheme. [9] Однако не все реализации Scheme поддерживают все SRFI.

Ссылки

  1. ^ ab Barry Hayes (1997). "Эфемероны: новый механизм завершения". Объектно-ориентированные языки, программирование, системы и приложения .
  2. ^ "Специальные объекты - Руководство пользователя GNU Smalltalk" . Получено 20 февраля 2013 г.
  3. ^ "Эфемероны" . Получено 20 февраля 2013 г.
  4. ^ "Lua 5.4 Reference Manual, §2.5.3" . Получено 30 января 2022 г.
  5. ^ ".NET 4.0 - System.Runtime.CompilerServices.ConditionalWeakTable". Веб-блог IKVM.NET . Получено 14 октября 2013 г.
  6. ^ Бобо, Франсуа. «Эфемероны встречают OCaml GC» (PDF) . Семинар пользователей и разработчиков OCaml 2014 . Архивировано из оригинала (PDF) 19 ноября 2016 г. . Получено 5 апреля 2018 г. .
  7. ^ Мински, Ярон. "OCaml 4.03: Все остальное". Jane Street Tech Blog . Получено 5 апреля 2018 г.
  8. ^ "15.2 Эфемероны" . Получено 20 февраля 2013 г.
  9. ^ «SRFI-124: Эфемероны».
Взято с "https://en.wikipedia.org/w/index.php?title=Эфемерон&oldid=1262899504"