Каждая JVM отличается, но JVM HotSpot не полагается в первую очередь на подсчет ссылок в качестве средства для сбора мусора. Преимущество подсчета ссылок заключается в простоте реализации, но оно по своей природе подвержено ошибкам. В частности, если у вас есть цикл ссылок (набор объектов, которые все ссылаются друг на друга в цикле), то при подсчете ссылок не будут корректно возвращаться эти объекты, поскольку все они имеют ненулевой счетчик ссылок. Это заставляет вас время от времени использовать вспомогательный сборщик мусора, который, как правило, работает медленнее (именно в Mozilla Firefox возникла именно эта проблема, и их решение заключалось в добавлении сборщика мусора за счет большей читаемости кода). Вот почему, например, такие языки, как C ++, обычно имеют комбинацию shared_ptr
с, которые используют подсчет ссылок, и weak_ptr
с, которые не используют циклы ссылок.
Кроме того, привязка счетчика ссылок к каждому объекту увеличивает стоимость назначения ссылки больше, чем обычно, из-за дополнительной бухгалтерии, связанной с настройкой счетчика ссылок (которая только ухудшается при наличии многопоточности). Кроме того, использование подсчета ссылок исключает использование определенных типов быстрых распределителей памяти, что может быть проблемой. Это также имеет тенденцию приводить к фрагментации кучи в ее наивном виде, поскольку объекты рассеяны по памяти, а не плотно упакованы, сокращая время выделения и вызывая плохую локальность.
В HotSpot JVM используются различные методы сбора мусора, но его основной сборщик мусора называется сборщиком остановок и копий. Этот сборщик работает, размещая объекты в памяти рядом друг с другом, и позволяет чрезвычайно быстро (одна или две инструкции по сборке) размещать новые объекты. Когда пространство заканчивается, все новые объекты GC'ed одновременно, что обычно убивает большинство новых объектов, которые были построены. В результате сборщик мусора намного быстрее, чем обычная реализация с подсчетом ссылок, и в итоге получает лучшую локальность и лучшую производительность.
Для сравнения методов сбора мусора вместе с кратким обзором работы GC в HotSpot, вы можете проверить эти слайды лекций из курса компиляторов что я учил прошлым летом. Возможно, вы также захотите взглянуть на технический сборщик мусора HotSpot , в котором более подробно рассказывается о том, как работает сборщик мусора, включая способы настройки сборщика в приложении. база приложения.
Надеюсь, это поможет!