由从未引用的对象创建的垃圾

时间:2015-12-17 17:31:55

标签: java garbage-collection garbage

是否从未引用的对象创建了任何垃圾?

我想到的例子是使用静态工厂方法创建一个对象,然后让该对象执行一个函数,但从不创建对它的引用。

例如:

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

这是否只是在eden空间中创建一个未引用的对象,一旦下一个集合发生就会被垃圾收集?

4 个答案:

答案 0 :(得分:7)

getLogger返回一个实例 - 无论是创建新实例还是返回先前缓存的实例,都取决于LoggerFactory的实现。如果不再以某种方式从工厂内部引用此对象,则它将有资格进行垃圾回收。

答案 1 :(得分:1)

如果getLogger()没有将创建的Logger存储在某处(这很可能),那么是的。垃圾收集器非常善于处理短期对象,所以它应该很快得到GCd。

当然没有人会写出特定的日志记录行,因为它没有任何意义。

答案 2 :(得分:1)

Java GC通过定期分析哪些对象可通过一系列引用访问来工作。这并不取决于这些对象是否始终可以访问。

您的问题表明您认为GC可能会留意要回收的引用以确定要收集哪些对象。虽然不禁止GC这样做,但它不能完全依赖这样的策略,而且我不知道任何现有的Java GC实现使用它。

答案 3 :(得分:1)

  

这是否只是在eden空间中创建一个未引用的对象,一旦下一个集合发生就会被垃圾收集?

也许,也许不是。 Logger实例在this

中被引用为info()

E.g。如果info()然后创建一个匿名内部类或这个捕获lambda并将其放在一个任务队列上,那么Logger实例的寿命可能比你问题中的代码行长。

在大多数情况下,它可能仍然是非常短暂的。但你无法从单行代码中知道这一点。

在光谱的另一端,由于逃逸分析

,对象可能永远不会首先在堆上分配,即不在eden空间中。