任何未使用的对象可以从垃圾收集器中逃脱吗?

Gur*_*lki 3 java garbage-collection

是否有任何可能没有在任何地方引用并仍然存在于堆上的对象.我的意思是,有一个未使用的对象有可能从垃圾收集器中转义并在堆上直到应用程序结束.

想要知道因为如果它在那里,那么在编码时我可以更加谨慎.

dan*_*ben 8

如果一个对象不再被引用,它仍然存在于堆上,但它也可以自由地被垃圾收集(除非我们正在谈论Class对象,它们存在于PermGen空间中并且永远不会被垃圾收集 - 但这通常是不是你需要担心的事情).

无法保证多久,但在回收这些对象的内存之前,您的应用程序不会耗尽内存.

但是,垃圾收集确实涉及开销,因此如果您创建的对象超出了您的需求并且可以轻松创建更少的对象,那么一定要这样做.

编辑:响应您的评论,如果某个对象确实没有被任何东西引用,它将在垃圾收集期间回收(假设您使用的是Sun的最新JVM;我不能说其他实现).原因如下:所有对象都在堆上连续分配.当GC要发生时,JVM会跟随对它知道可以访问的"标记"对象的所有引用 - 然后将这些对象移动到另一个干净的区域.旧区域被认为是空闲记忆.通过引用无法找到的任何内容都无法移动.关键是GC不需要"找到"未引用的对象.如果有的话,我会更担心在它们不打算时仍然被引用的对象,这将导致内存泄漏.


Ste*_*son 6

您应该知道,在JVM抛出内存不足异常之前,它会收集所有可能的垃圾.