2010-01-24 46 views

回答

2

一个典型的例子是一个事件监听器。每当一个事件监听器被注册时,该类的引用就被保存。如果对象已处理但事件侦听器未取消注册,则由于对事件侦听器的引用,对象永远不会从内存中释放。

此处了解详情: http://www.javaworld.com/javaworld/javatips/jw-javatip79.html

1

因为如果一个对象,它是在使用中还是有你想收集另一个对象的引用,使用中的对象仍然可以使用和采取行动你想被垃圾收集的对象。如果一个对象没有用,那么对它的引用应该被删除,以便对象可以被垃圾收集。

垃圾收集本身并不能防止内存泄漏。有些情况下很可能泄漏内存。你刚刚发现了其中的一种场景。

3

只要有人引用了某个对象,就可以使用它,并且JVM不能垃圾收集它。

JVM通过查找从根到所涉对象的引用路径来确定对象群是否仍在使用中。这意味着引用彼此但不从系统其余部分引用的对象集合将被垃圾收集。

所以,只要有一个指向你的对象不会阻止你被垃圾收集。

2

这种情况发生的典型场景是当你有一个静态的地图,这个地图被填满了,但从未被清除。 Map不能被垃圾收集,因为它是静态引用的,并且Map中的条目不能被垃圾收集,因为它们是从Map中引用的。

0

如果您有对该对象的引用,那么JVM应该如何知道它是“无用的”?如果您不需要它,请删除引用,并且JVM可以告诉您不打算再使用它。 Java中的GC非常好,但它无法读取您的想法或确定您的代码意图。

0

这不是垃圾收集,因为JVM无法判断将来是否会遵循该对象变量中的引用。在一般情况下,做出这样的决定将要求JVM解决暂停问题。

3

理想情况下,自动内存管理器会释放对应用程序不再有用的对象。

已经证明,不可能以100%的准确度和在所有情况下确定之后是否使用给定的对象。相反,垃圾收集器使用“下一个最好的东西”,那就是它们释放的对象不是可达的对象:无法从应用程序访问的对象,缺少对该对象的引用路径,将永远不会使用应用程序甚至没有办法注意到该对象仍然存在。这是一个近似值,但它是安全的:GC不会释放仍在使用中的对象,但它可能无法释放不会再使用的对象,如果该对象似乎可到达(即应用程序可能仍然伸出手抓住物体,如果愿意的话)。

“内存泄漏”是未使用的对象使用过量的RAM的情况。什么是“无序的”取决于应用程序。单个未使用的对象很少成为问题。通常的重要泄漏是未使用但可达的物体以数千的数量积累的情况。

+0

我通常同意你写的内容,除了我将内存泄漏定义为这样一种情况,即语义上无意义的对象消耗的内存可能会增长为有用对象所消耗的内存的无限多倍。一个程序需要无界内存来执行应该只需要有限内存的任务,可能没有泄漏(例如,通过将块读入链表,然后在全部读取后计算新行数来查找文件是否具有偶数或奇数行),但有泄漏的程序需要无限的内存。 – supercat 2013-01-26 23:01:20