Ответ 1
Когда вы используете язык с сборкой мусора, вы не получите доступ непосредственно к памяти. Скорее вам предоставляется доступ к некоторой абстракции поверх этих данных. Одной из вещей, которые должным образом отвлечены, является фактическое местоположение в памяти блока данных, а также указатели на другие блоки данных. Когда сборщик мусора запускается (иногда это происходит), он проверяет, сохраняете ли вы все ссылки на каждый из блоков памяти, которые он выделил для вас. Если вы этого не сделаете, это освободит эту память.
Основное различие между различными типами сборщиков мусора - их эффективность, а также любые ограничения в отношении того, какие схемы распределения они могут обрабатывать.
Простейшим является правильный подсчет ссылок. Когда вы создаете ссылку на объект, внутренний счетчик на этом объекте увеличивается, когда вы теряете ссылку или больше не в области, счетчик на (предыдущем) целевом объекте уменьшается. Когда этот счетчик достигает нуля, объект больше не передается и может быть освобожден.
Проблема с подсчетом подсчета сборщиков мусора заключается в том, что они не могут обрабатывать циклические данные. Если объект A имеет ссылку на объект B и который, в свою очередь, имеет некоторую (прямую или косвенную) ссылку на объект A, они никогда не могут быть освобождены, даже если ни один из объектов в цепочке не встречается вне цепочки (и поэтому aren ' t доступно для программы вообще).
Алгоритм Mark и sweep, с другой стороны, может справиться с этим. Алгоритм маркировки и развертки работает, периодически останавливая выполнение программы, отмечая каждый элемент, который программа выделила как недоступный. Затем программа проходит через все переменные, которые программа имеет, и отмечает, на что они указывают, как достижимые. Если какое-либо из этих распределений содержит ссылки на другие данные в программе, эти данные затем также обозначаются как достижимые и т.д.
Это часть метки алгоритма. В этот момент все программы могут получить доступ, независимо от того, как косвенно, отмечены как достижимые, и все, что программа не может достичь, отмечена как недостижимая. Теперь сборщик мусора может безопасно восстановить память, связанную с объектами, отмеченными как недоступные.
Проблема с алгоритмом метки и развертки заключается в том, что она не настолько эффективна - вся программа должна быть остановлена для ее запуска, и многие ссылки на объекты не будут меняться.
Чтобы улучшить это, алгоритм метки и развертки может быть расширен с помощью так называемой "сборной мусора". В этом режиме объекты, которые были в системе для некоторого количества сборщиков мусора, продвигаются в прежнее поколение, что часто не проверяется.
Это повышает эффективность, потому что объекты, как правило, умирают молодыми (думайте о том, что строка изменяется внутри цикла, что может привести к жизни в течение нескольких сотен циклов) или жить очень долго (объекты, используемые для представления основного окна приложения, или соединение с базой данных сервлета).
Более подробная информация содержится в википедии.
Добавлен на основе комментариев:
С помощью алгоритма метки и развертки (а также любого другого алгоритма сбора мусора, кроме подсчета ссылок) сбор мусора не запускается в контексте вашей программы, так как он должен иметь доступ к материалам, которые ваша программа не способна доступа непосредственно. Поэтому неправильно говорить, что сборщик мусора работает в стеке.