Мусор, созданный объектом, на который никогда не ссылаются
Есть ли мусор, созданный объектом, на который никогда не ссылаются?
Пример, о котором я думаю, - это использование статического метода фабрики для создания объекта, затем этот объект выполняет функцию, но никогда не создает ссылку на него.
Например:
LoggerFactory.getLogger(Foo.class).info("logging some stuff");
Создает ли это просто объект без ссылок в пространстве eden, который будет собирать мусор, как только произойдет следующая сборка?
4 ответа
getLogger
возвращает экземпляр - создает ли он новый или возвращает ранее кэшированный, до LoggerFactory
Реализация. Если на этот объект больше не ссылаются изнутри фабрики, он будет иметь право на сборку мусора.
При условии, что getLogger()
не сохраняет созданное Logger
где-то (что вполне возможно), тогда да. Сборщик мусора очень хорош в утилизации недолговечных объектов, поэтому он должен получить GCd довольно быстро.
Конечно, никто не напишет эту конкретную строку регистрации, так как это не имеет смысла.
Java GC работает, периодически анализируя, какие объекты доступны через цепочку ссылок. Это не зависит от того, были ли эти объекты вообще достижимы.
Ваш вопрос говорит о том, что вы думаете, что GC может отслеживать ссылки, которые необходимо восстановить, чтобы определить, какие объекты собирать. Хотя GC не запрещается делать это, он не может полагаться исключительно на такую стратегию, и мне неизвестно о какой-либо существующей реализации Java GC, использующей ее.
Создает ли это просто объект без ссылок в пространстве eden, который будет собирать мусор, как только произойдет следующая сборка?
Может быть, а может и нет. Logger
экземпляр ссылается как this
внутри info()
Например, если info() затем создает анонимный внутренний класс или лямбду с захватом этого и помещает его в очередь задач, то Logger
Экземпляр может жить дольше, чем строка кода в вашем вопросе.
В большинстве сценариев это, вероятно, все еще очень недолговечно. Но вы не можете знать это наверняка из одной строки кода.
На другом конце спектра объект никогда не может быть размещен в куче, т. Е. Даже в пространстве Eden, из-за Escape-анализа