Действительно ли он способен обрабатывать все неиспользуемые объекты
Нет, не может. Однако он может собирать все объекты, которые больше нельзя использовать , и делает это очень хорошо. Разница тонкая, см. Ниже.
Объяснение
Например, скажем, у вас есть следующий код:
class A {
public static Date d = new Date(); // d will never be collected
}
И скажем, вы знаете, что через некоторое время к 1017 * больше никогда не будет доступа. Однако во время выполнения система не имеет этой информации, и d
будет сохраняться в течение неопределенного времени, в то время как в C ++ вы можете явно удалить ее.
Вместо этого сборщик мусора собирает все объекты , которые больше не доступны . Например:
void f() {
Date d = new Date();
System.out.println(d.toString());
} // d is no longer accessible at this point
Сборщик мусора обнаруживает, что объект, на который ссылается d
, никогда не будет снова доступен, поскольку d
является его единственной ссылкой и выходит из области видимости в конце метода. Сбор недоступных объектов - это недооценка вопроса «какие объекты могут быть собраны», но он безопасен, поскольку гарантирует, что живой объект никогда не будет собран.
Разница тонкая, и действительно, в самом здравом коде будут собраны все объекты, которые вы больше не используете. Эта коллекция сама по себе завершена, способна правильно идентифицировать и собрать каждый недоступный объект , и включает в себя объекты, которые недоступны, поскольку все их ссылки находятся в других недоступных объектах.