Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

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

Описание [ править ]

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

Использует [ редактировать ]

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

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

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

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

История [ править ]

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

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

Smalltalk [ править ]

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

Lua [ править ]

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

.NET [ править ]

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

OCaml [ править ]

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

Ракетка [ править ]

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

Ссылки [ править ]

  1. ^ a b Барри Хейс (1997). «Эфемероны: новый механизм завершения» . Объектно-ориентированные языки, программирование, системы и приложения .
  2. ^ «Особые объекты - Руководство пользователя GNU Smalltalk» . Проверено 20 февраля 2013 года .
  3. ^ «Эфемероны» . Проверено 20 февраля 2013 года .
  4. ^ "Справочное руководство по Lua 5.2" . Проверено 20 февраля 2013 года .
  5. ^ a b ".NET 4.0 - System.Runtime.CompilerServices.ConditionalWeakTable" . Журнал IKVM.NET . Проверено 14 октября 2013 года .
  6. ^ Бобот, Франсуа. «Эфемероны встречаются с OCaml GC» (PDF) . Семинар для пользователей и разработчиков OCaml 2014 . Проверено 5 апреля 2018 года .
  7. ^ Минский, Ярон. «OCaml 4.03: Все остальное» . Технический блог Джейн-Стрит . Проверено 5 апреля 2018 года .
  8. ^ «15.2 Эфемероны» . Проверено 20 февраля 2013 года .