是否从未引用的对象创建了任何垃圾?
我想到的例子是使用静态工厂方法创建一个对象,然后让该对象执行一个函数,但从不创建对它的引用。
例如:
LoggerFactory.getLogger(Foo.class).info("logging some stuff");
这是否只是在eden空间中创建一个未引用的对象,一旦下一个集合发生就会被垃圾收集?
答案 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空间中。