Сбор мусора (информатика)
В информатике ) — сбор мусора ( GC это форма автоматического управления памятью . [2] Сборщик мусора пытается освободить память, выделенную программой, но на которую больше нет ссылок; такая память называется мусором . Сбор мусора был изобретен американским ученым-компьютерщиком Джоном Маккарти примерно в 1959 году для упрощения ручного управления памятью в Lisp . [3]
Сбор мусора освобождает программиста от ручного управления памятью , когда программист указывает, какие объекты нужно освободить и вернуть в систему памяти и когда это сделать. [4] Другие подобные методы включают в себя выделение стека , вывод области и владение памятью, а также их комбинации. Сбор мусора может занимать значительную часть общего времени обработки программы и влиять на производительность в результате .
Ресурсы, отличные от памяти, такие как сетевые сокеты , дескрипторы баз данных , окна , дескрипторы файлов и дескрипторы устройств, обычно обрабатываются не сборкой мусора, а другими методами (например, деструкторами ). Некоторые такие методы также освобождают память.
Обзор
[ редактировать ]Этот раздел нуждается в дополнительных цитатах для проверки . ( Июль 2014 г. ) |
Многие языки программирования требуют сборки мусора либо как часть спецификации языка (например, RPL , Java , C# , D , [5] Go и большинство языков сценариев ) или эффективно для практической реализации (например, формальные языки, такие как лямбда-исчисление ). [6] Говорят, что это языки со сборкой мусора . Другие языки, такие как C и C++ , были разработаны для использования с ручным управлением памятью, но имеют доступные реализации со сборкой мусора. Некоторые языки, такие как Ada , Modula-3 и C++/CLI , позволяют как сборку мусора, так и ручное управление памятью сосуществовать в одном приложении , используя отдельные кучи для собираемых и управляемых вручную объектов. Третьи, такие как D , осуществляют сбор мусора, но позволяют пользователю вручную удалять объекты или даже полностью отключать сбор мусора, когда требуется скорость. [7]
Хотя многие языки интегрируют GC в свои компиляторы и системы выполнения , также существуют системы post-hoc GC, такие как автоматический подсчет ссылок (ARC). Некоторые из этих систем post-hoc GC не требуют перекомпиляции. [8]
Преимущества
[ редактировать ]GC освобождает программиста от необходимости вручную освобождать память. Это помогает избежать некоторых ошибок : [9]
- Висячие указатели , которые возникают, когда часть памяти освобождается, хотя на нее еще есть указатели , и один из этих указателей разыменовывается . К тому времени память может быть переназначена для другого использования с непредсказуемыми результатами. [10]
- Ошибки двойного освобождения , возникающие, когда программа пытается освободить уже освобожденную и, возможно, уже выделенную снова область памяти.
- Определенные виды утечек памяти , при которых программе не удается освободить память, занятую объектами, которые стали недоступными , что может привести к исчерпанию памяти. [11]
Недостатки
[ редактировать ]GC использует вычислительные ресурсы, чтобы решить, какую память освободить. Таким образом, расплатой за удобство не аннотировать время жизни объекта вручную в исходном коде являются накладные расходы , которые могут ухудшить производительность программы. [12] В рецензируемой статье 2005 года сделан вывод, что GC требуется в пять раз больше памяти, чтобы компенсировать эти издержки и работать так же быстро, как та же программа, использующая идеализированное явное управление памятью. Однако сравнение проводится с программой, созданной путем вставки вызовов освобождения с использованием оракула , реализованной путем сбора трассировок из программ, запускаемых под управлением профилировщика , и программа корректна только для одного конкретного выполнения программы. [13] Взаимодействие с эффектами иерархии памяти может сделать эти издержки невыносимыми в обстоятельствах, которые трудно предсказать или обнаружить при рутинном тестировании. Влияние на производительность было названо Apple причиной отказа от внедрения сборки мусора в iOS , несмотря на то, что это самая желанная функция. [14]
Момент фактической сборки мусора может быть непредсказуемым, что приводит к зависаниям (паузам для перемещения/освобождения памяти), разбросанным по всему сеансу . Непредсказуемые задержки могут быть неприемлемы в средах реального времени , при обработке транзакций или в интерактивных программах. Инкрементальные, параллельные сборщики мусора и сборщики мусора в реальном времени решают эти проблемы, но с различными компромиссами.
Стратегии
[ редактировать ]Отслеживание
[ редактировать ]Отслеживание сборки мусора является наиболее распространенным типом сборки мусора, настолько, что «сборка мусора» часто относится к отслеживанию сборки мусора, а не к другим методам, таким как подсчет ссылок . Общая стратегия состоит в определении того, какие объекты следует собирать мусором, путем отслеживания того, какие объекты доступны по цепочке ссылок от определенных корневых объектов, а также рассмотрения остальных как мусора и их сбора. Однако при реализации используется большое количество алгоритмов, различающихся по сложности и характеристикам производительности.
Подсчет ссылок
[ редактировать ]Сборка мусора с подсчетом ссылок — это сборка мусора, в которой каждый объект подсчитывает количество ссылок на него. Мусор идентифицируется по нулевому счетчику ссылок. Счетчик ссылок на объект увеличивается при создании ссылки на него и уменьшается при уничтожении ссылки. Когда счетчик достигает нуля, память объекта освобождается. [15]
Как и при ручном управлении памятью, и в отличие от отслеживания сборки мусора, подсчет ссылок гарантирует, что объекты уничтожаются, как только уничтожается их последняя ссылка, и обычно обращается только к памяти, которая находится либо в кэшах ЦП , либо в объектах, которые необходимо освободить, либо непосредственно указывает на них. ими и, следовательно, не имеет существенных негативных побочных эффектов на работу кэша ЦП и виртуальной памяти .
Подсчет ссылок имеет ряд недостатков; Обычно это можно решить или смягчить с помощью более сложных алгоритмов:
- Циклы
- Если два или более объекта ссылаются друг на друга, они могут создать цикл, в котором ни один из них не будет собран, поскольку их взаимные ссылки никогда не позволят их счетчикам ссылок стать нулевыми. Некоторые системы сбора мусора, использующие подсчет ссылок (например, в CPython ), используют специальные алгоритмы обнаружения циклов для решения этой проблемы. [16] Другая стратегия — использовать слабые ссылки для «обратных указателей», создающих циклы. При подсчете ссылок слабая ссылка аналогична слабой ссылке при отслеживающем сборщике мусора. Это специальный ссылочный объект, существование которого не увеличивает счетчик ссылок ссылочного объекта. Более того, слабая ссылка безопасна тем, что, когда референтный объект становится мусором, любая слабая ссылка на него теряет силу , а не остается висящей, а это означает, что она превращается в предсказуемое значение, например нулевую ссылку.
- Накладные расходы на пространство (счетчик ссылок)
- Подсчет ссылок требует выделения места для каждого объекта для хранения счетчика ссылок. Счетчик может храниться рядом с памятью объекта или в боковой таблице где-то еще, но в любом случае каждый отдельный объект с подсчетом ссылок требует дополнительного хранилища для своего счетчика ссылок. Для этой задачи обычно используется пространство памяти размером с беззнаковый указатель, а это означает, что для каждого объекта должно быть выделено 32 или 64 бита памяти счетчика ссылок. В некоторых системах эти издержки можно уменьшить, используя тегированный указатель для хранения счетчика ссылок в неиспользуемых областях памяти объекта. Часто архитектура фактически не позволяет программам получать доступ ко всему диапазону адресов памяти, которые могут храниться в ее собственном размере указателя; определенное количество старших битов адреса либо игнорируется, либо должно быть равно нулю. Если объект надежно имеет указатель в определенном месте, счетчик ссылок может храниться в неиспользуемых битах указателя. Например, каждый объект в Objective-C имеет указатель на свой класс в начале своей памяти; в архитектуре ARM64 с использованием iOS 7 19 неиспользуемых битов указателя этого класса используются для хранения счетчика ссылок объекта. [17] [18]
- Накладные расходы на скорость (приращение/уменьшение)
- В простых реализациях каждое назначение ссылки и каждая ссылка, выходящая за пределы области действия, часто требуют модификации одного или нескольких счетчиков ссылок. Однако в общем случае, когда ссылка копируется из переменной внешней области во внутреннюю переменную, так что время жизни внутренней переменной ограничено временем жизни внешней, приращение ссылки можно исключить. Внешняя переменная «владеет» ссылкой. В языке программирования C++ этот метод легко реализуется и демонстрируется с использованием
const
ссылки. Подсчет ссылок в C++ обычно реализуется с помощью « умных указателей ». [19] чьи конструкторы, деструкторы и операторы присваивания управляют ссылками. Интеллектуальный указатель можно передать по ссылке на функцию, что позволяет избежать необходимости копировать и создавать новый интеллектуальный указатель (что приведет к увеличению счетчика ссылок при входе в функцию и уменьшению его при выходе). Вместо этого функция получает ссылку на интеллектуальный указатель, который создается недорого. Метод подсчета ссылок Дойча-Боброва использует тот факт, что большинство обновлений счетчика ссылок фактически генерируются ссылками, хранящимися в локальных переменных. Она игнорирует эти ссылки, считая только ссылки в куче, но прежде чем объект с нулевым счетчиком ссылок может быть удален, система должна проверить с помощью сканирования стека и зарегистрировать, что других ссылок на него все еще не существует. Дальнейшее существенное снижение накладных расходов на обновления счетчиков может быть достигнуто за счет объединения обновлений, предложенного Леванони и Петранком . [20] [21] Рассмотрим указатель, который за заданный интервал выполнения обновляется несколько раз. Сначала он указывает на объектO1
, затем к объектуO2
и так далее, пока в конце интервала не укажет на какой-нибудь объектOn
. Алгоритм подсчета ссылок обычно выполняетсяrc(O1)--
,rc(O2)++
,rc(O2)--
,rc(O3)++
,rc(O3)--
, ...,rc(On)++
. Но большинство этих обновлений избыточны. Чтобы правильно оценить счетчик ссылок в конце интервала, достаточно выполнитьrc(O1)--
иrc(On)++
. Леванони и Петранк зафиксировали исключение более 99% обновлений счетчиков в типичных тестах Java.
- Требуется атомарность
- При использовании в многопоточной среде эти модификации (увеличение и уменьшение) могут быть атомарными операциями , такими как сравнение и замена , по крайней мере, для любых объектов, которые являются общими или потенциально общими для нескольких потоков. Атомарные операции являются дорогостоящими для мультипроцессора и еще более дорогими, если их приходится эмулировать с помощью программных алгоритмов. Этой проблемы можно избежать, добавив счетчики ссылок для каждого потока или каждого процессора и получая доступ к глобальному счетчику ссылок только тогда, когда локальные счетчики ссылок становятся или больше не равны нулю (или, альтернативно, используя двоичное дерево счетчиков ссылок или даже отказ от детерминированного разрушения в обмен на полное отсутствие глобального счетчика ссылок), но это добавляет значительные затраты памяти и, таким образом, имеет тенденцию быть полезным только в особых случаях (он используется, например, при подсчете ссылок модулей ядра Linux ). Объединение обновлений Леванони и Петранка [20] [21] может использоваться для устранения всех атомарных операций из барьера записи. Счетчики никогда не обновляются потоками программы в ходе ее выполнения. Они изменяются только сборщиком, который выполняется как один дополнительный поток без синхронизации. Этот метод можно использовать как механизм остановки мира для параллельных программ, а также с одновременным сборщиком подсчета ссылок.
- Не в режиме реального времени
- Наивные реализации подсчета ссылок обычно не обеспечивают поведение в реальном времени, поскольку любое назначение указателя потенциально может привести к рекурсивному освобождению ряда объектов, ограниченных только общим размером выделенной памяти, в то время как поток не сможет выполнять другую работу. Эту проблему можно избежать, делегировав освобождение объектов, на которые нет ссылок, другим потокам за счет дополнительных накладных расходов.
Анализ побега
[ редактировать ]Escape-анализ — это метод времени компиляции, который может преобразовать выделение кучи в выделение стека , тем самым уменьшая объем выполняемой сборки мусора. Этот анализ определяет, доступен ли объект, выделенный внутри функции, за ее пределами. Если обнаруживается, что локальное выделение функции доступно для другой функции или потока, говорят, что выделение «ускользает» и не может быть выполнено в стеке. В противном случае объект может быть выделен непосредственно в стеке и освобожден при завершении функции, минуя кучу и связанные с ней затраты на управление памятью. [22]
Доступность
[ редактировать ]Вообще говоря, языки программирования более высокого уровня, скорее всего, будут иметь сбор мусора в качестве стандартной функции. В некоторых языках, где отсутствует встроенная сборка мусора, ее можно добавить через библиотеку, как в случае со сборщиком мусора Boehm для C и C++.
Большинство языков функционального программирования , таких как ML , Haskell и APL , имеют встроенную сборку мусора. Lisp особенно примечателен как первый язык функционального программирования , так и первый язык, в котором реализована сборка мусора. [23]
Другие динамические языки, такие как Ruby и Julia (но не Perl 5 или PHP до версии 5.3), [24] оба используют подсчет ссылок), JavaScript и ECMAScript также имеют тенденцию использовать GC. Объектно-ориентированные языки программирования, такие как Smalltalk , RPL и Java, обычно обеспечивают интегрированную сборку мусора. Заметными исключениями являются C++ и Delphi , в которых есть деструкторы .
БАЗОВЫЙ
[ редактировать ]BASIC и Logo часто использовали сборку мусора для типов данных переменной длины, таких как строки и списки, чтобы не обременять программистов деталями управления памятью. На Altair 8800 программы с большим количеством строковых переменных и небольшим строковым пространством могли вызывать длительные паузы из-за сборки мусора. [25] Аналогичным образом алгоритм сборки мусора интерпретатора Applesoft BASIC неоднократно сканирует дескрипторы строк в поисках строки, имеющей самый высокий адрес, чтобы сжать ее в большую память, в результате чего производительность [26] и делает паузу от нескольких секунд до нескольких минут. [27] Новый сборщик мусора для Applesoft BASIC, разработанный Рэнди Виггинтоном, идентифицирует группу строк при каждом проходе по куче, что значительно сокращает время сбора данных. [28] BASIC.SYSTEM, выпущенный вместе с ProDOS в 1983 году, предоставляет оконный сборщик мусора для BASIC, который работает во много раз быстрее. [29]
Цель-C
[ редактировать ]Хотя в Objective-C традиционно не было сборки мусора, с выпуском OS X 10.5 в 2007 году Apple представила сбор мусора для Objective-C 2.0 с использованием сборщика времени выполнения, разработанного собственными силами. [30] Однако с выпуском OS X 10.8 в 2012 году сборка мусора была прекращена в пользу (ARC) LLVM автоматического счетчика ссылок , который был представлен в OS X 10.7 . [31] Более того, с мая 2015 года Apple даже запретила использовать сборку мусора для новых приложений OS X в App Store . [32] [33] Для iOS сбор мусора никогда не вводился из-за проблем с отзывчивостью и производительностью приложений; [14] [34] вместо этого iOS использует ARC. [35] [36]
Ограниченные среды
[ редактировать ]Сборка мусора редко используется во встроенных системах или системах реального времени из-за обычной необходимости очень жесткого контроля над использованием ограниченных ресурсов. Однако были разработаны сборщики мусора, совместимые со многими ограниченными средами. [37] Microsoft .NET Micro Framework , .NET nanoFramework [38] и Java Platform, Micro Edition — это встроенные программные платформы, которые, как и их более крупные собратья, включают в себя сбор мусора.
Ява
[ редактировать ]Сборщики мусора, доступные в Java JDK, включают:
- Г1
- Параллельно
- Сборщик одновременных меток (CMS)
- Серийный
- C4 (Коллектор непрерывного параллельного сжатия) [39]
- Шенандоа
- ЗГК
Использование во время компиляции
[ редактировать ]Сбор мусора во время компиляции — это форма статического анализа, позволяющая повторно использовать и освобождать память на основе инвариантов, известных во время компиляции.
Эта форма сборки мусора изучалась на языке программирования Mercury , [40] и он получил более широкое распространение с появлением (ARC) LLVM автоматического счетчика ссылок в экосистеме Apple (iOS и OS X) в 2011 году. [35] [36] [32]
Системы реального времени
[ редактировать ]Инкрементные, параллельные сборщики мусора и сборщики мусора в реальном времени были разработаны, например, Генри Бейкером и Генри Либерманом . [41] [42] [43]
В алгоритме Бейкера выделение осуществляется в любой половине одной области памяти. Когда он заполняется наполовину, выполняется сборка мусора, которая перемещает живые объекты в другую половину, а оставшиеся объекты неявно освобождаются. Запущенная программа («мутатор») должна проверить, что любой объект, на который она ссылается, находится в правильной половине, и, если нет, переместить его, пока фоновая задача находит все объекты. [44]
Схемы поколенческой сборки мусора основаны на эмпирическом наблюдении, что большинство объектов умирают молодыми. При сборке мусора по поколениям сохраняются две или более области выделения (поколения), которые хранятся отдельно в зависимости от возраста объекта. Новые объекты создаются в «молодом» поколении, которое регулярно собирается, а когда поколение заполняется, объекты, на которые все еще ссылаются старые регионы, копируются в следующее старейшее поколение. Иногда выполняется полная проверка.
Некоторые компьютерные архитектуры на языке высокого уровня включают аппаратную поддержку сборки мусора в реальном времени.
Большинство реализаций сборщиков мусора в реальном времени используют трассировку . [ нужна ссылка ] Такие сборщики мусора в реальном времени сталкиваются с жесткими ограничениями реального времени при использовании с операционной системой реального времени. [45]
См. также
[ редактировать ]- Деструктор (компьютерное программирование)
- Динамическое устранение мертвого кода
- Умный указатель
- Сжатие виртуальной памяти
Ссылки
[ редактировать ]- ^ Абельсон, Гарольд; Сассман, Джеральд Джей; Сассман, Джули (2016). Структура и интерпретация компьютерных программ (PDF) (2-е изд.). Кембридж, Массачусетс, США: MIT Press . стр. 734–736.
- ^ «Что такое сборка мусора (GC) в программировании?» . Хранилище . Проверено 21 июня 2024 г.
- ^ Маккарти, Джон (1960). «Рекурсивные функции символьных выражений и их машинное вычисление, Часть I» . Коммуникации АКМ . 3 (4): 184–195. дои : 10.1145/367177.367199 . S2CID 1489409 . Проверено 29 мая 2009 г.
- ^ «Что такое сборка мусора (GC) в программировании?» . ПоискХранилища . Проверено 17 октября 2022 г.
- ^ «Обзор – язык программирования D» . dlang.org . Цифровой Марс . Проверено 29 июля 2014 г.
- ^ Хеллер, Мартин (3 февраля 2023 г.). «Что такое сборка мусора? Автоматизированное управление памятью для ваших программ» . Инфомир . Проверено 21 июня 2024 г.
- ^ «Руководство по сборке мусора в программировании» . freeCodeCamp.org . 16 января 2020 г. Проверено 21 июня 2024 г.
- ^ «Сборка мусора — язык программирования D» . dlang.org . Проверено 17 октября 2022 г.
- ^ «Сбор мусора» . rebelsky.cs.grinnell.edu . Проверено 13 января 2024 г.
- ^ Хеллер, Мартин (3 февраля 2023 г.). «Что такое сборка мусора? Автоматизированное управление памятью для ваших программ» . Инфомир . Проверено 21 июня 2024 г.
- ^ Майкрософт . «Основы сборки мусора | Microsoft Learn» . Проверено 29 марта 2023 г.
- ^ Зорн, Бенджамин (22 января 1993 г.). «Оценочная стоимость консервативного сбора мусора». Программное обеспечение: практика и опыт . 23 (7). Департамент компьютерных наук Университета Колорадо в Боулдере : 733–756. CiteSeerX 10.1.1.14.1816 . дои : 10.1002/спе.4380230704 . S2CID 16182444 .
- ^ Герц, Мэтью; Бергер, Эмери Д. (2005). «Количественная оценка производительности сборки мусора по сравнению с явным управлением памятью» (PDF) . Материалы 20-й ежегодной конференции ACM SIGPLAN по объектно-ориентированному программированию, системам, языкам и приложениям — OOPSLA '05 . стр. 313–326. дои : 10.1145/1094811.1094836 . ISBN 1-59593031-0 . S2CID 6570650 . Архивировано (PDF) из оригинала 2 апреля 2012 г. Проверено 15 марта 2015 г.
- ^ Перейти обратно: а б «Начало работы с инструментами разработчика – сеанс 300» (PDF) . WWDC 2011 . Apple, Inc. 24 июня 2011 г. Архивировано из оригинала (PDF) 4 сентября 2023 г. Проверено 27 марта 2015 г.
- ^ Майкрософт . «Сборка мусора с подсчетом ссылок» . Проверено 29 марта 2023 г.
- ^ «Счетчик ссылок» . Расширение и встраивание интерпретатора Python . 21 февраля 2008 г. Проверено 22 мая 2014 г.
- ^ Эш, Майк. «Пятничные вопросы и ответы 27 сентября 2013 г.: ARM64 и вы» . mikeash.com . Проверено 27 апреля 2014 г.
- ^ «Hamster Emporium: [объяснение объекта]: isa без указателя» . Sealiesoftware.com. 24 сентября 2013 г. Проверено 27 апреля 2014 г.
- ^ Пибингер, Роланд (3 мая 2005 г.) [17 апреля 2005 г.]. «RAII, динамические объекты и фабрики в C++» .
- ^ Перейти обратно: а б Леванони, Йоси; Петранк, Эрез (2001). «Сборщик мусора с подсчетом ссылок на лету для Java» . Материалы 16-й конференции ACM SIGPLAN по объектно-ориентированному программированию, системам, языкам и приложениям . OOPSLA 2001. стр. 367–380. дои : 10.1145/504282.504309 .
- ^ Перейти обратно: а б Леванони, Йоси; Петранк, Эрез (2006). «Сборщик мусора с подсчетом ссылок на лету для Java» . АКМ Транс. Программа. Ланг. Сист . 28 : 31–69. CiteSeerX 10.1.1.15.9106 . дои : 10.1145/1111596.1111597 . S2CID 14777709 .
- ^ Саланьяк, Гийом; Йовине, Серхио; Гарбервецкий, Диего (24 мая 2005 г.). «Анализ быстрого выхода для управления памятью на основе регионов» . Электронные заметки по теоретической информатике . 131 : 99–110. дои : 10.1016/j.entcs.2005.01.026 .
- ^ Чисналл, Дэвид (12 января 2011 г.). Влиятельные языки программирования, часть 4: Лисп .
- ^ «PHP: вопросы производительности» . php.net . Проверено 14 января 2015 г.
- ^ «Справочное руководство Altair 8800 Basic 4.1» (PDF) . Цифровой архив винтажных технологий . Апрель 1977 г. с. 108. Архивировано (PDF) из оригинала 29 июня 2021 г. Проверено 29 июня 2021 г.
- ^ «Я проделал некоторую работу по ускорению сборки строкового мусора в Applesoft…» Hacker News . Проверено 29 июня 2021 г.
- ^ Литтл, Гэри Б. (1985). Внутри Apple IIc . Боуи, Мэриленд: Brady Communications Co. p. 82. ИСБН 0-89303-564-5 . Проверено 29 июня 2021 г.
- ^ «Быстрый сбор мусора». Звонок-ЯБЛОКО : 40–45. Январь 1981 года.
- ^ Стоит, Дон (1984). Под Apple Pro DOS (PDF) (печатная версия, март 1985 г.). Чатсуорт, Калифорния, США: Качественное программное обеспечение. стр. 2–6. ISBN 0-912985-05-4 . Архивировано (PDF) из оригинала 3 декабря 2008 г. Проверено 29 июня 2021 г.
- ^ «Обзор Objective-C 2.0» . Архивировано из оригинала 24 июля 2010 г.
- ^ Сиракузы, Джон (20 июля 2011 г.). «Mac OS X 10.7 Lion: обзор Ars Technica» .
- ^ Перейти обратно: а б «Apple заявляет, что производители приложений для Mac должны перейти на управление памятью ARC к маю» . AppleInsider . 20 февраля 2015 г.
- ^ Сихон, Вальдемар (21 февраля 2015 г.). «App Store: Apple удаляет программы, использующие сбор мусора» . Heise.de . Проверено 30 марта 2015 г.
- ^ Сильва, Драгоценный (18 ноября 2014 г.). «iOS 8 против Android 5.0 Lollipop: Apple убивает Google эффективностью памяти» . Интернэшнл Бизнес Таймс . Архивировано из оригинала 3 апреля 2015 г. Проверено 7 апреля 2015 г.
- ^ Перейти обратно: а б Нэпьер, Роб; Кумар, Мугунт (20 ноября 2012 г.). Программирование iOS 6, расширяющее границы . Джон Уайли и сыновья . ISBN 978-1-11844997-4 . Проверено 30 марта 2015 г.
- ^ Перейти обратно: а б Круз, Хосе Р.К. (22 мая 2012 г.). «Автоматический подсчет ссылок на iOS» . Доктор Доббс . Архивировано из оригинала 16 мая 2020 г. Проверено 30 марта 2015 г.
- ^ Фу, Вэй; Хаузер, Карл (2005). «Среда сбора мусора в реальном времени для встроенных систем». Материалы семинара 2005 г. по программному обеспечению и компиляторам для встраиваемых систем - SCOPES '05 . стр. 20–26. дои : 10.1145/1140389.1140392 . ISBN 1-59593207-0 . S2CID 8635481 .
- ^ «.NET nanoFramework» .
- ^ Тене, Гил; Айенгар, Баладжи; Вольф, Майкл (2011). «C4: коллектор непрерывного уплотнения» (PDF) . ISMM '11: Материалы международного симпозиума по управлению памятью . дои : 10.1145/1993478 . ISBN 978-1-45030263-0 . Архивировано (PDF) из оригинала 9 августа 2017 г.
- ^ Мазур, Нэнси (май 2004 г.). Сборка мусора во время компиляции для декларативного языка Mercury (PDF) (Диссертация). Католический университет Левена . Архивировано (PDF) из оригинала 27 апреля 2014 г.
- ^ Хюльсберген, Лоренц; Уинтерботтом, Фил (1998). «Очень параллельная сборка мусора с пометкой и очисткой без детальной синхронизации» (PDF) . Материалы Первого международного симпозиума по управлению памятью - ISMM '98 . стр. 166–175. дои : 10.1145/286860.286878 . ISBN 1-58113114-3 . S2CID 14399427 . Архивировано (PDF) из оригинала 13 мая 2008 г.
- ^ «Часто задаваемые вопросы по GC» .
- ^ Либерман, Генри; Хьюитт, Карл (1983). «Сборщик мусора в реальном времени, основанный на времени жизни объектов» . Коммуникации АКМ . 26 (6): 419–429. дои : 10.1145/358141.358147 . hdl : 1721.1/6335 . S2CID 14161480 .
- ^ Бейкер, Генри Г. (1978). «Обработка списков в реальном времени на последовательном компьютере». Коммуникации АКМ . 21 (4): 280–294. дои : 10.1145/359460.359470 . hdl : 1721.1/41976 . S2CID 17661259 . см. также описание
- ^ Макклоски; Бекон; Ченг; Grove (2008), Staccato: параллельный и параллельный сборщик мусора с уплотнением в реальном времени для мультипроцессоров (PDF) , заархивировано (PDF) из оригинала 11 марта 2014 г.
Дальнейшее чтение
[ редактировать ]- Джонс, Ричард; Хоскинг, Энтони; Мосс, Дж. Элиот Б. (16 августа 2011 г.). Справочник по сбору мусора: искусство автоматического управления памятью . Серия прикладных алгоритмов и структур данных CRC. Чепмен и Холл / CRC Press / Taylor & Francisco Ltd. ISBN 978-1-4200-8279-1 . (511 страниц)
- Джонс, Ричард; Линс, Рафаэль (12 июля 1996 г.). Сбор мусора: алгоритмы автоматического динамического управления памятью (1-е изд.). Уайли . ISBN 978-0-47194148-4 . (404 страницы)
- Шорр, Герберт; Уэйт, Уильям М. (август 1967 г.). «Эффективная машинно-независимая процедура сборки мусора в различных структурах списков» (PDF) . Коммуникации АКМ . 10 (8): 501–506. дои : 10.1145/363534.363554 . S2CID 5684388 . Архивировано (PDF) из оригинала 22 января 2021 г.
- Уилсон, Пол Р. (1992). «Методы однопроцессорной сборки мусора». Управление памятью . Конспекты лекций по информатике. Том. 637. Шпрингер-Верлаг . стр. 1–42. CiteSeerX 10.1.1.47.2438 . дои : 10.1007/bfb0017182 . ISBN 3-540-55940-Х .
{{cite book}}
:|journal=
игнорируется ( помогите ) - Уилсон, Пол Р.; Джонстон, Марк С.; Нили, Майкл; Болес, Дэвид (1995). «Динамическое распределение памяти: обзор и критический обзор». Управление памятью . Конспекты лекций по информатике. Том. 986 (1-е изд.). стр. 1–116. CiteSeerX 10.1.1.47.275 . дои : 10.1007/3-540-60368-9_19 . ISBN 978-3-540-60368-9 .
{{cite book}}
:|journal=
игнорируется ( помогите )
Внешние ссылки
[ редактировать ]- Справочник по управлению памятью
- Самые основы сбора мусора
- Настройка сборки мусора виртуальной машины HotSpot в Java SE 6
- TinyGC — независимая реализация API BoehmGC.
- Консервативная реализация сборки мусора для языка C
- MeixnerGC — инкрементальный сборщик мусора для C++ с использованием интеллектуальных указателей.