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