Консервативный сборщик мусора - PullRequest
18 голосов
/ 03 октября 2011

Я видел сборщиков мусора, помеченных как много поколений и т. Д. Но я видел, что Boehm GC помечен как "консервативный".Что именно это значит?

Ответы [ 2 ]

25 голосов
/ 03 октября 2011

Сборщик мусора должен сканировать все объекты и вызовы (стек выполнения), чтобы идентифицировать все «живые» адреса в исполняемой программе, а затем «собирать» объекты, которые не имеют «живых» адресов. В некоторых средах алгоритм GC может быть ТОЧНЫМ и точно знать, что является адресом объекта, а что нет. В других средах он должен сканировать части хранилища (прежде всего, стек выполнения), где есть слова хранилища, которые МОГУТ быть адресом объекта, и делать КОНСЕРВАТИВНОЕ предположение, что если он выглядит как действительный адрес, и существует объект, который имеет это адрес, то объект не должен быть собран.

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

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

7 голосов
/ 14 января 2012

Консервативный сборщик мусора - это тот, кто не знает, является ли данное слово указателем. Если слово указывает на выделенный блок кучи, то сборщик мусора консервативно предполагает, что слово является указателем, и, следовательно, не перерабатывает этот блок кучи или что-либо, что считается доступным из него.

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

  1. Значения, которые выглядят как указатели, вызывают утечку памяти, предотвращая повторное использование частей кучи. Это гораздо большая проблема с 32-битными адресными пространствами, потому что почти каждый int будет указывать на блок кучи, если выделено ГБ ОЗУ.

  2. Определение того, указывает или нет слово на выделенный блок кучи, требует поиска кучи, которая является медленной и (объективно) ненужной.

  3. GC не может перемещать блоки кучи, потому что он не может обновлять указатели, потому что он не знает, где они все находятся.

  4. Код, который скрывает указатели или использует указатели вне блока кучи, приведет к сбою консервативного GC. Эта проблема возникла с кодом «Числовые рецепты» и Boehm GC, хотя код NR C нарушил спецификацию C.

Эти недостатки достаточно серьезны, поэтому сборщики мусора стараются по возможности не быть консервативными.

...