Вот высокоуровневое сопоставление маркеров различных методов, упомянутых в цитируемой цитате (плюс «отметка и компактность» ... что является вариацией отметки и разметки.)
Свойства коллекции подсчета ссылок:
- PRO - мусор утилизируется немедленно (кроме циклов)
- PRO - паузы сбора мусора меньше и минимальны, если вы можете отложить обновление структуры данных «свободного места».
- CON - счетчик ссылок должен быть скорректирован в большинстве операций записи указателя
- CON - свободное пространство никогда не сжимается
- CON - поскольку свободное пространство не сжимается, должна поддерживаться структура данных «свободного пространства», что увеличивает затраты на выделение и освобождение.
- CON - циклический мусор не собирается, если только приложение не прерывает цикл вручную.
- CON - обновление счетчиков ссылок в многопоточном приложении обходится слишком дорого.
Для классической разметки:
- PRO - нет указателя при записи
- PRO - циклические данные собираются
- PRO - можно избежать узких мест в параллельном управлении хранилищем (кроме GC)
- CON - остановка сборки мусора
- CON - свободное пространство никогда не сжимается
- CON - поскольку свободное пространство не сжимается, должна поддерживаться структура данных «свободного пространства», которая увеличивает затраты на выделение и освобождение.
Классическая метка-развертка иногда модифицируется таким образом, что фаза развертки уплотняет свободное пространство путем «скольжения» объектов без мусора. Это называется "mark-sweep-compact". Это довольно сложно, но:
- PRO - нет указателей при записи
- PRO - циклические данные собираются
- PRO - узких мест параллелизма в управлении хранением можно легко избежать (кроме GC)
- CON - сборщик мусора "останови мир"
- PRO - свободное место сжимается, поэтому выделение является дешевым
- CON - компактная фаза довольно дорогая
Современные коллекционеры (в том числе типичные коллекционные коллекторы) основаны на пометках и копиях. Идея состоит в том, что сборщик отслеживает объекты в «из космоса», копируя их в «в космос». Когда это сделано, в конце «to space» появляется непрерывный кусок свободного пространства, который можно использовать для выделения новых объектов. Старый «из космоса» кладется на одну сторону в следующий раз, когда запускается сборщик мусора. Хорошая особенность копирования коллекции заключается в том, что стоимость сборки мусора, связанной с объектом мусора, близка к нулю.
- CON - указатель накладных расходов на запись (для записи, когда указатель «нового поколения» записывается в объект «старого поколения»)
- PRO - циклические данные собираются
- PRO - узких мест параллелизма в управлении хранилищем можно легко избежать (кроме GC)
- CON - остановить сборку мусора, хотя это может быть уменьшено за счет некоторых накладных расходов времени выполнения
- PRO - с помощью сборщиков поколений вы обычно собираете только часть кучи с большим количеством мусора, и, следовательно, издержки сборщика мусора в среднем меньше
- PRO - меньшие паузы GC (большую часть времени)
- PRO - свободное место сжимается, поэтому выделение дешево
- PRO - уплотнение обходится дешевле, чем со скользящим компактором
- CON - вам необходимо зарезервировать дополнительное пространство для объекта для коллектора.
Коллектор поколений - это тот, в котором есть несколько пространств (поколений), которые собираются с разной скоростью. Это основано на гипотезе, что большинство объектов создаются, а затем становятся недоступными в течение короткого периода времени. Таким образом, собирая мусор в пространстве, содержащем молодые объекты, вы освобождаете относительно большое количество места при относительно низких затратах. Вам все еще нужно собрать старшее поколение, но это может случаться реже.
(Коллектор с меткой-зачисткой может быть поколением, но выигрыш не такой большой, как для копирующего коллектора.)