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

Garbage Created By Object that is Never Referenced

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

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

例如:

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

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

getLogger returns 一个实例 - 它是创建一个新实例还是 returns 一个以前缓存的实例取决于 LoggerFactory 的实现。如果这个对象不再以某种方式从工厂内部被引用,它将有资格被垃圾收集。

只要 getLogger() 没有将创建的 Logger 存储在某个地方(这是很有可能的),那么是的。垃圾收集器非常擅长处理短期对象,因此它应该很快获得 GCd。

当然没有人会写那个特定的日志行,因为它没有意义。

Java GC 的工作原理是定期分析哪些对象可以通过引用链访问。这并不取决于这些对象是否首先可以到达。

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

Does this just create an unreferenced object in eden space that will be garbage collected as soon as the next collection happens?

也许,也许不是。 Logger 实例在 info()

中被引用为 this

例如如果 info() 然后创建一个匿名内部 class 或一个 this-capturing lambda 并将其放在任务队列中,那么 Logger 实例的寿命可能比您问题中的代码行长。

在大多数情况下,它可能仍然非常短暂。但是你不能从单行代码中确定这一点。

在光谱的另一端,由于逃逸分析[=24=,对象可能永远不会首先在堆上分配,即甚至在伊甸园中也不会space ]