2015-12-17 4 views
2

Является ли какой-либо мусор, созданный объектом, на который никогда не ссылаются?Мусор, созданный объектом, который никогда не упоминается

Пример, который, как я полагаю, использует статический заводский метод для создания объекта, тогда этот объект выполняет функцию, но никогда не создает ссылку на нее.

Для примера:

LoggerFactory.getLogger(Foo.class).info("logging some stuff"); 

ли это просто создать объект без ссылок Эдема пространства, который будет сборщиком мусора, как только следующий сбор происходит?

+1

Это зависит от того, что LoggerFactory.getLogger() делает. Если он содержит ссылку на созданный регистратор, он не будет GCed. Если это не так, то это будет GCed ... некоторое время. –

ответ

7

getLogger возвращает экземпляр - независимо от того, создает ли он новый или возвращает ранее сохраненный кеш-файл до реализации LoggerFactory. Если этот объект больше не упоминается внутри фабрики каким-либо образом, он будет иметь право на сбор мусора.

1

При условии, что getLogger() не сохраняет созданный Logger где-то (что вполне возможно), то да. Сборщик мусора очень хорошо разбирается в короткоживущих объектах, поэтому он должен получить GCd довольно быстро.

Конечно, никто не напишет эту конкретную линию ведения журнала, так как это бессмысленно.

1

Java GC работает, периодически анализируя, какие объекты достижимы по цепочке ссылок. Это не зависит от того, достигли ли эти объекты в первую очередь.

Ваш вопрос предполагает, что вы считаете, что GC может следить за ссылками, которые будут исправлены, чтобы определить, какие объекты собирать. Хотя GC не запрещается делать это, он не может полагаться исключительно на такую ​​стратегию, и я не знаю о какой-либо существующей реализации Java GC, использующей ее.

+0

@ the8472, вы можете * комментировать * по моему ответу, но не ставьте свои слова в рот. –

+0

мои извинения, я намеревался отредактировать свой собственный ответ. – the8472

1

Означает ли это, что это просто созданный объект unreferenced в пространстве eden, который будет собираться мусором, как только произойдет следующая коллекция?

Возможно, возможно нет. Пример экземпляра Logger обозначен как this внутри info()

E.g. if info() затем создает анонимный внутренний класс или эту захватную лямбду и помещает ее в очередь задач, тогда экземпляр Logger может проживать дольше, чем строка кода в вашем вопросе.

В большинстве сценариев, вероятно, все еще очень недолго. Но вы не можете точно знать это из одной строки кода.

На другом конце спектра объект не может быть выделен в куче, в первую очередь, то есть даже не в Эдеме пространстве, из-за Побеги Анализа

Смежные вопросы