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

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

В алгоритмах сборки мусора счетчики ссылок могут использоваться для освобождения ненужных объектов.

Преимущества и недостатки [ править ]

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

Пример кругового списка из магистерской диссертации 1985 года. [1] Прямоугольники обозначают пары Лиспа со счетчиками ссылок. Даже если входящий левый верхний указатель удаляется, все счетчики остаются> 0.

Циклы трассировки сборки мусора запускаются слишком часто, если набор живых объектов заполняет большую часть доступной памяти [ необходима цитата ] ; это требует дополнительного места, чтобы быть эффективным [ цитата ] . Производительность подсчета ссылок не ухудшается при уменьшении общего объема свободного пространства. [2]

Счетчики ссылок также являются полезной информацией для использования в качестве входных данных для других оптимизаций времени выполнения. Например, системы, которые сильно зависят от неизменяемых объектов, таких как многие языки функционального программирования, могут страдать от снижения эффективности из-за частого копирования. [ необходима цитата ] Однако, если компилятор (или исполняющая система ) знает, что конкретный объект имеет только одну ссылку (как в большинстве случаев во многих системах), и что ссылка теряется одновременно с созданием аналогичного нового объекта ( как в операторе добавления строки str ← str + "a"), он может заменить операцию мутацией исходного объекта.

Подсчет ссылок в наивной форме имеет два основных недостатка по сравнению с трассирующей сборкой мусора, оба из которых требуют дополнительных механизмов для улучшения:

  • Частые обновления, которые он включает, являются источником неэффективности. Хотя трассировка сборщиков мусора может серьезно повлиять на эффективность из-за переключения контекста и ошибок строки кэша, они собирают относительно редко, в то время как доступ к объектам осуществляется постоянно. Кроме того, что менее важно, подсчет ссылок требует, чтобы каждый управляемый памятью объект зарезервировал место для счетчика ссылок. При трассировке сборщиков мусора эта информация неявно сохраняется в ссылках, которые ссылаются на этот объект, что экономит место, хотя для трассировки сборщиков мусора, особенно инкрементных, может потребоваться дополнительное пространство для других целей.
  • Наивный алгоритм, описанный выше, не может справиться ссылочные циклы , объект, который ссылается прямо или косвенно на себя. Механизм, основанный исключительно на счетчике ссылок, никогда не будет рассматривать циклические цепочки объектов для удаления, поскольку их счетчик ссылок гарантированно останется ненулевым (см. Рисунок). Существуют методы решения этой проблемы, но они также могут увеличивать накладные расходы и сложность подсчета ссылок - с другой стороны, эти методы нужно применять только к данным, которые могут образовывать циклы, часто к небольшому подмножеству всех данных. Один из таких методов - использование слабых ссылок , а другой предполагает использованиеалгоритма очистки меток , который нечасто вызывается для очистки.

В дополнение к этому, если память выделяется из списка свободных, подсчет ссылок страдает от плохой локальности. Один только подсчет ссылок не может перемещать объекты для повышения производительности кеша, поэтому высокопроизводительные сборщики также реализуют трассирующий сборщик мусора. Большинство реализаций (например, в PHP и Objective-C) страдают от низкой производительности кеша, поскольку они не реализуют копирование объектов. [3]

Интерпретация графика [ править ]

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

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

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

Работа с неэффективностью обновлений [ править ]

Увеличение и уменьшение счетчиков ссылок каждый раз, когда ссылка создается или уничтожается, может значительно снизить производительность. Операции не только требуют времени, но и снижают производительность кеша и могут привести к образованию пузырей в конвейере . Даже операции только для чтения, такие как вычисление длины списка, требуют большого количества операций чтения и записи для обновления ссылок с простым подсчетом ссылок.

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

Метод подсчета ссылок Дойча-Боброу основан на том факте, что большинство обновлений счетчика ссылок фактически генерируются ссылками, хранящимися в локальных переменных. Он игнорирует эти ссылки, только подсчитывая ссылки в структурах данных, но перед тем, как объект с нулевым счетчиком ссылок может быть удален, система должна проверить с помощью сканирования стека и регистрации, что никакой другой ссылки на него еще не существует.

Другой метод , разработанный Генри Бейкер включает в себя отложенные приращения , [4] , в котором ссылки , которые хранятся в локальных переменных не сразу приращение соответствующего счетчика ссылок, но вместо того, чтобы отложить рассмотрение этого пока не надо. Если такая ссылка быстро уничтожается, то обновлять счетчик не нужно. Это устраняет большое количество обновлений, связанных с недолговечными ссылками (например, приведенный выше пример подсчета длины списка). Однако, если такая ссылка копируется в структуру данных, тогда необходимо выполнить отложенное приращение. Также важно выполнить отложенное приращение до того, как счетчик объекта упадет до нуля, что приведет к преждевременному освобождению.

Значительное сокращение накладных расходов на обновление счетчиков было получено Леванони и Петранком . [5] [6] Они представляют метод объединения обновлений, который объединяет множество избыточных обновлений счетчика ссылок. Рассмотрим указатель, который в заданном интервале выполнения обновляется несколько раз. Сначала он указывает на объект O1, затем на объект O2и так далее, пока в конце интервала не указывает на какой-либо объект On. Алгоритм подсчета ссылок, как правило , выполнять rc(O1)--, rc(O2)++, rc(O2)--, rc(O3)++, rc(O3)--, ..., rc(On)++. Но большинство этих обновлений избыточны. Для правильной оценки счетчика ссылок в конце интервала достаточно выполнитьrc(O1)--и rc(On)++. Остальные обновления избыточны.

Леванони и Петранк показали в 2001 году, как использовать такое объединение обновлений в сборщике подсчета ссылок. При использовании объединения обновлений с соответствующей обработкой новых объектов более 99% обновлений счетчика удаляются для типичных тестов Java. Кроме того, устраняется необходимость в атомарных операциях во время обновления указателей на параллельных процессорах. Наконец, они представили улучшенный алгоритм, который может работать одновременно с многопоточными приложениями, использующими только точную синхронизацию. [7]

Метод скрытого подсчета ссылок Блэкберна и Мак-Кинли в 2003 г. [8] сочетает отложенный подсчет ссылок с копирующим питомником, наблюдая, что большинство мутаций указателя происходит в молодых объектах. Этот алгоритм обеспечивает пропускную способность, сравнимую с быстродействующими сборщиками копирования поколений с малым ограниченным временем паузы при подсчете ссылок.

Работа со ссылочными циклами [ править ]

Возможно, наиболее очевидный способ управления ссылочными циклами - это спроектировать систему, чтобы избежать их создания. Система может явно запретить ссылочные циклы; файловые системы с жесткими ссылками часто делают это. Разумное использование «слабых» (не подсчитываемых) ссылок также может помочь избежать циклов сохранения; структура Какао , например, рекомендует использовать «сильные» ссылки для отношений родитель-потомок и «слабые» ссылки для отношений потомок-родитель. [9]

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

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

Бэкон описывает алгоритм циклического сбора для подсчета ссылок, сходный с отслеживанием сборщиков, включая те же теоретические временные рамки. Он основан на наблюдении, что цикл может быть изолирован только тогда, когда счетчик ссылок уменьшается до ненулевого значения. Все объекты, с которыми это происходит, помещаются в корневой список, а затем программа периодически ищет циклы в объектах, доступных из корней. Он знает, что нашел цикл, который можно собрать, когда уменьшение всех счетчиков ссылок в цикле ссылок сводит их все к нулю. [10] Усовершенствованная версия этого алгоритма, разработанная Paz et al. [11]может выполняться одновременно с другими операциями и повышать свою эффективность за счет использования метода объединения обновлений Леванони и Петранка. [5] [6]

Варианты форм [ править ]

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

Взвешенный подсчет ссылок [ править ]

При взвешенном подсчете ссылок каждой ссылке назначается вес , и каждый объект отслеживает не количество ссылающихся на него ссылок, а общий вес ссылок, ссылающихся на него. Первоначальная ссылка на вновь созданный объект имеет большой вес, например 2 16 . Всякий раз, когда эта ссылка копируется, половина веса переходит в новую ссылку, а половина веса остается в старой ссылке. Поскольку общий вес не меняется, счетчик ссылок на объект обновлять не нужно.

Уничтожение ссылки уменьшает общий вес на вес этой ссылки. Когда общий вес становится равным нулю, все ссылки уничтожаются. Если сделана попытка скопировать ссылку с весом 1, ссылка должна «получить больший вес», добавив к общему весу, а затем добавив этот новый вес к ссылке, а затем разделив его. Альтернативой в этой ситуации является создание объекта косвенной ссылки, исходная ссылка на который создается с большим весом, который затем может быть разделен.

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

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

Взвешенный подсчет ссылок был независимо разработан Беваном [12] и Уотсоном и Ватсоном [13] в 1987 году.

Косвенный подсчет ссылок [ править ]

При косвенном подсчете ссылок необходимо отслеживать источник ссылки. Это означает, что на объект сохраняются две ссылки: прямая, которая используется для вызовов; и косвенный, который является частью дерева распространения, например, в алгоритме Дейкстры – Шолтена , который позволяет сборщику мусора идентифицировать мертвые объекты. Такой подход предотвращает преждевременный выброс объекта.

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

Сборка мусора [ править ]

Как алгоритм сбора, подсчет ссылок отслеживает для каждого объекта счет количества ссылок на него, удерживаемых другими объектами. Если счетчик ссылок на объект достигает нуля, объект становится недоступным и может быть уничтожен.

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

Простой счетчик ссылок требует частого обновления. Каждый раз, когда ссылка уничтожается или перезаписывается, счетчик ссылок объекта, на который она ссылается, уменьшается, а всякий раз, когда одна создается или копируется, счетчик ссылок объекта, на который она ссылается, увеличивается.

Подсчет ссылок также используется в файловых и распределенных системах, где полная неинкрементная сборка мусора с трассировкой занимает слишком много времени из-за размера графа объектов и низкой скорости доступа. [14]

Компонентная объектная модель [ править ]

Модель компонентных объектов Microsoft (COM) и WinRT повсеместно используют подсчет ссылок. Фактически, два из трех методов, которые должны предоставить все COM-объекты (в интерфейсе IUnknown ), увеличивают или уменьшают счетчик ссылок. Большая часть оболочки Windows и многих приложений Windows (включая MS Internet Explorer , MS Office и бесчисленное количество сторонних продуктов) построены на COM, что демонстрирует жизнеспособность подсчета ссылок в крупномасштабных системах.

Одним из основных мотивов подсчета ссылок в COM является обеспечение взаимодействия между разными языками программирования и системами времени выполнения. Клиенту нужно только знать, как вызывать методы объекта, чтобы управлять жизненным циклом объекта; таким образом, клиент полностью абстрагируется от любого распределителя памяти, используемого реализацией COM-объекта. Как типичный пример, программа Visual Basic, использующая COM-объект, не зависит от того, был ли этот объект выделен (и должен быть позже освобожден) распределителем C ++ или другим компонентом Visual Basic.

C ++ [ править ]

C ++ не выполняет подсчет ссылок по умолчанию, следуя своей философии отказа от добавления функций, которые могут повлечь за собой накладные расходы, если пользователь не запросил их явно. К объектам, которые совместно используются, но не принадлежат, можно получить доступ через ссылку, необработанный указатель или итератор (концептуальное обобщение указателей).

Однако по тому же принципу C ++ предоставляет пользователям собственные способы выбора таких функций: C ++ 11 предоставляет интеллектуальные указатели с подсчетом ссылок через std::shared_ptrкласс, что позволяет автоматически управлять общей памятью динамически выделяемых объектов. Программисты могут использовать это в сочетании со слабыми указателями ( переходными отверстиями std::weak_ptr) для разрыва циклических зависимостей. Объекты, которые выделяются динамически, но не предназначены для совместного использования, могут автоматически управлять своим временем жизни с помощью файла std::unique_ptr.

Кроме того, семантика перемещения C ++ 11 еще больше снижает степень, в которой необходимо изменять счетчики ссылок, удаляя глубокую копию, обычно используемую, когда функция возвращает объект, поскольку она допускает простую копию указателя указанного объекта.

Какао (Цель-C) [ править ]

В фреймворках Apple Cocoa и Cocoa Touch (и связанных с ними фреймворках, таких как Core Foundation ) используется ручной подсчет ссылок, как и в COM . Традиционно это выполнялось программистом вручную, отправляя retainи releaseсообщения объектам, но в iOS 5 [15] и Mac OS X 10.7 был добавлен автоматический подсчет ссылок , функция компилятора Clang, которая автоматически вставляет эти сообщения по мере необходимости . [16] Mac OS X 10.5 представила трассирующий сборщик мусора в качестве альтернативы подсчету ссылок, но он устарел в OS X 10.8. и удален из библиотеки времени выполнения Objective-C в macOS Sierra . [17] [18] iOS никогда не поддерживала трассирующий сборщик мусора.

Delphi [ править ]

Delphi в основном не является языком сборки мусора, поскольку определяемые пользователем типы должны по-прежнему выделяться и освобождаться вручную, однако он обеспечивает автоматическую сборку с использованием подсчета ссылок для нескольких встроенных типов, таких как строки, динамические массивы и интерфейсы, для простоты использования и упрощения общих функций базы данных. Программист должен решить, использовать ли встроенные типы; Программисты Delphi имеют полный доступ к низкоуровневому управлению памятью, как в C / C ++. Таким образом, при желании можно легко обойти всю потенциальную стоимость подсчета ссылок Delphi.

Некоторые из причин, по которым подсчет ссылок мог быть предпочтительнее других форм сборки мусора в Delphi, включают:

  • Общие преимущества подсчета ссылок, такие как быстрый сбор.
  • Циклы либо не могут возникать, либо не возникают на практике, потому что ни один из встроенных типов со сборкой мусора не является рекурсивным. (используя интерфейсы, можно создать такой сценарий, но это не обычное использование)
  • Накладные расходы в размере кода, необходимого для подсчета ссылок, очень малы (на собственном x86, как правило, одна инструкция LOCK INC, LOCK DEC или LOCK XADD, которая обеспечивает атомарность в любой среде), и для сбора не требуется отдельный поток управления, как это было бы быть необходимо для трассирующего сборщика мусора.
  • Многие экземпляры наиболее часто используемого типа «сборщик мусора», строки, имеют короткое время жизни, поскольку они обычно являются промежуточными значениями при манипуляциях со строками. Можно оптимизировать использование многих локальных строк, но компилятор в настоящее время этого не делает.
  • Счетчик ссылок строки проверяется перед изменением строки. Это позволяет напрямую изменять строки счетчика ссылок 1, в то время как строки с более высоким счетчиком ссылок копируются перед изменением. Это позволяет сохранить общее поведение строк паскаля старого стиля, устраняя при этом затраты на копирование строки при каждом назначении.
  • Поскольку сборка мусора выполняется только для встроенных типов, подсчет ссылок можно эффективно интегрировать в библиотечные подпрограммы, используемые для управления каждым типом данных, уменьшая накладные расходы, необходимые для обновления счетчиков ссылок. Более того, большая часть библиотеки времени выполнения находится на ассемблере, оптимизированном вручную.
  • Тип строки может быть преобразован в указатель на char, и таким образом могут выполняться высокопроизводительные операции. Это важно, поскольку и Delphi, и FPC реализуют свой RTL на Паскале. Такие варианты литья есть у различных других автоматических типов.

GObject [ править ]

В GObject объектно-ориентированного программирования рамочные реализует подсчет ссылок на своих базовых типов, в том числе слабые ссылки . При увеличении и уменьшении ссылок используются атомарные операции для обеспечения безопасности потоков. Значительный объем работы по написанию привязок к GObject из языков высокого уровня заключается в адаптации подсчета ссылок GObject для работы с собственной системой управления памятью языка.

В языке программирования Vala в качестве основной системы сбора мусора используется подсчет ссылок GObject, а также обработка строк с большим количеством копий. [19]

Perl [ править ]

Perl также использует подсчет ссылок без какой-либо специальной обработки циклических ссылок, хотя (как в Cocoa и C ++ выше) Perl поддерживает слабые ссылки, что позволяет программистам избегать создания цикла.

PHP [ править ]

PHP использует механизм подсчета ссылок для управления внутренними переменными. [20] Начиная с PHP 5.3, он реализует алгоритм из вышеупомянутой статьи Бэкона. PHP позволяет включать и выключать сбор циклов с помощью функций пользовательского уровня. Это также позволяет вручную принудительно запустить механизм продувки.

Python [ править ]

Python также использует подсчет ссылок и также предлагает обнаружение циклов (и может восстанавливать их). [21]

Ржавчина [ править ]

Rust использует объявленное время жизни в коде для освобождения памяти. В Rust есть Rcи Arcstruct.

Тип Rc<T>обеспечивает совместное владение значением типа T, размещенным в куче. [22]

используйте std :: rc :: Rc ; struct  Cat {  цвет : строка ,}fn  main () {  пусть кошка = кошка { цвет : "черный" . to_string () };       let cat = Rc :: new ( кошка );   }

Белка [ править ]

Squirrel использует подсчет ссылок с обнаружением цикла. Этот крошечный язык относительно неизвестен за пределами индустрии видеоигр; однако это конкретный пример того, как подсчет ссылок может быть практичным и эффективным (особенно в средах реального времени). [ необходима цитата ]

Tcl [ править ]

Tcl - 8 использует подсчет ссылок для управления памятью значений (Tcl Obj структур ). Поскольку значения Tcl неизменяемы, ссылочные циклы невозможно сформировать, и схема обнаружения циклов не требуется. Операции, которые заменяют значение измененной копией, обычно оптимизируются для изменения оригинала, когда его счетчик ссылок указывает, что он не является общим. Ссылки подсчитываются на уровне структуры данных, поэтому проблемы с очень частыми обновлениями, описанные выше, не возникают.

Xojo [ править ]

Xojo также использует подсчет ссылок без какой-либо специальной обработки циклических ссылок, хотя (как в Cocoa и C ++ выше) Xojo поддерживает слабые ссылки, что позволяет программистам избегать создания цикла.

Файловые системы [ править ]

Многие файловые системы поддерживают счетчик ссылок на какой - либо конкретный блок или файл, например, инод подсчет ссылок на файловых системах Unix-стиле , которые, как правило , известны как жесткие ссылки . Когда счетчик достигает нуля, файл можно безопасно освободить. Хотя ссылки по-прежнему могут быть сделаны из каталогов , некоторые Unix-системы допускают ссылки только из активных процессов, и могут быть файлы, которые существуют вне иерархии файловой системы.

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

  1. ^ Кевин Г. Кэссиди (декабрь 1985). Возможность автоматического восстановления памяти с одновременным выполнением программ в среде LISP (PDF) (магистерская диссертация). Военно-морская аспирантура, Монтерей / Калифорния. Здесь: стр.25
  2. ^ Уилсон, Пол Р. "Однопроцессорные методы сборки мусора" . Материалы международного семинара по управлению памятью . Лондон, Великобритания: Springer-Verlag. С. 1–42. ISBN 3-540-55940-Х. Проверено 5 декабря 2009 года . Раздел 2.1.
  3. ^ Рифат Шахрияр, Стивен М. Блэкберн, Си Ян и Кэтрин С. МакКинли (2013). «Снятие перчаток с помощью контрольного подсчета Immix» (PDF) . 24-я конференция ACM SIGPLAN по системам, языкам и приложениям объектно-ориентированного программирования . OOPSLA 2013. DOI : 10,1145 / 2509136,2509527 . CS1 maint: несколько имен: список авторов ( ссылка )
  4. Генри Бейкер (сентябрь 1994 г.). «Минимизация обновления счетчика ссылок с помощью отложенных и привязанных указателей для функциональных структур данных». Уведомления ACM SIGPLAN . 29 (9): 38–43. CiteSeerX 10.1.1.25.955 . DOI : 10.1145 / 185009.185016 . 
  5. ^ а б Йоси Леванони, Эрез Петранк (2001). «Сборщик мусора с подсчетом ссылок на лету для java» . Материалы 16-й конференции ACM SIGPLAN по объектно-ориентированному программированию, системам, языкам и приложениям . OOPSLA 2001. С. 367–380. DOI : 10.1145 / 504282.504309 .
  6. ^ а б Йоси Леванони, Эрез Петранк (2006). «Сборщик мусора с подсчетом ссылок на лету для java» . ACM Trans. Программа. Lang. Syst . 28 : 31–69. CiteSeerX 10.1.1.15.9106 . DOI : 10.1145 / 1111596.1111597 . 
  7. ^ «Сборщик мусора с подсчетом ссылок на лету для Java» (PDF) . Cs.technion.ac.il . Проверено 24 июня 2017 года .
  8. ^ Стивен Блэкберн; Кэтрин МакКинли (2003). «Дополнительный подсчет ссылок: быстрая сборка мусора без длительного ожидания» (PDF) . Материалы 18-й ежегодной конференции ACM SIGPLAN по объектно-ориентированному программированию, системам, языкам и приложениям . OOPSLA 2003. С. 344–358. DOI : 10.1145 / 949305.949336 . ISBN  1-58113-712-5.
  9. ^ «Библиотека разработчика Mac» . Developer.apple.com . Проверено 17 декабря 2015 года .
  10. ^ Бэкон, Дэвид Ф .; Раджан, VT (2001). «Коллекция параллельных циклов в системах с подсчетом ссылок» (PDF) . ECOOP 2001 - Объектно-ориентированное программирование . Конспект лекций по информатике. 2072 . С. 207–235. DOI : 10.1007 / 3-540-45337-7_12 . ISBN  978-3-540-42206-8. Архивировано из оригинального (PDF) 23 июля 2004 года.
  11. ^ Harel Paz, Дэвид Ф. Бэкон, Эллиот К. Колоднер, Эрез Петранк , VT Rajan (2007). «Эффективный сбор цикла на лету». Транзакции ACM по языкам и системам программирования . 29 (4): 20 – es. CiteSeerX 10.1.1.10.2777 . DOI : 10.1145 / 1255450.1255453 . CS1 maint: несколько имен: список авторов ( ссылка )
  12. Перейти ↑ Bevan, DI (1987). «Распределенная сборка мусора с использованием подсчета ссылок». Том II: Параллельные языки на PARLE: Параллельные архитектуры и языки в Европе . Эйндховен, Нидерланды: Springer-Verlag. С. 176–187. ISBN 0-387-17945-3.
  13. ^ Уотсон, Пол; Уотсон, Ян (1987). «Эффективная схема сборки мусора для параллельных компьютерных архитектур». Том II: Параллельные языки на PARLE: Параллельные архитектуры и языки в Европе . Эйндховен, Нидерланды: Springer-Verlag. С. 432–443. ISBN 0-387-17945-3.
  14. ^ Бруно, Родриго; Феррейра, Паулу (2018). «Исследование алгоритмов сбора мусора для сред больших данных». ACM Computing Surveys . 51 : 1–35. DOI : 10.1145 / 3156818 .
  15. ^ [1] Архивировано 9 июня 2011 года в Wayback Machine.
  16. ^ «Библиотека разработчика Mac» . Developer.apple.com . Проверено 17 декабря 2015 года .
  17. Сиракуза, Джон (25 июля 2012 г.). «OS X 10.8 Mountain Lion: обзор Ars Technica» . Ars Technica . В разделе «Улучшения Objective-C» . Проверено 17 ноября +2016 .
  18. ^ «Примечания к выпуску Xcode 8» . Разработчик Apple . 27 октября 2016 года Архивировано из оригинала 19 марта 2017 года . Проверено 19 марта 2017 года .
  19. ^ "Проекты / Vala / ReferenceHandling - GNOME Wiki!" . ГНОМ. 25 мая 2015 . Проверено 17 декабря 2015 года .
  20. ^ "PHP: Основы подсчета ссылок - Руководство" . www.php.net . Дата обращения 1 октября 2020 .
  21. ^ «1. Расширение Python с помощью C или C ++ - документация Python 2.7.11» . Docs.python.org. 5 декабря 2015 . Проверено 17 декабря 2015 года .
  22. ^ "std :: rc - Rust" . doc.rust-lang.org . Дата обращения 2 ноября 2020 .

Внешние ссылки [ править ]

  • Справочник по диспетчеру памяти: Руководство для начинающих: переработка: количество ссылок
  • Сборщик мусора с подсчетом ссылок на лету для Java , Йоси Леванони и Эрез Петранк
  • Атомарные указатели подсчета ссылок: безблокирующий, асинхронный, поточно-ориентированный, многопроцессорный указатель подсчета ссылок , Кирк Рейнхольц
  • Расширение и встраивание интерпретатора Python: расширение Python с помощью C или C ++: количество ссылок , Гвидо ван Россум
  • Вниз по счету? Обратный отсчет на ринге , Рифат Шахрияр, Стивен М. Блэкберн и Дэниел Фрэмптон