如果任何对象变量仍然指向某个对象 没有用,那么JVM就不会垃圾收集那个对象 和对象将保留在内存中,造成内存泄漏
在上面的场景中,存在内存泄漏的可能性..为什么不收集垃圾? 任何人都可以详细说明吗?
答案 0 :(得分:3)
只要有人对某个对象有引用就可以使用它,而JVM也不能对它进行垃圾收集。
JVM通过查找从根到相关对象的引用路径来确定对象集群是否仍在使用中。这意味着相互引用但未从系统其余部分引用的对象集群将被垃圾收集。
所以简单地让一个物体指向你就不会阻止你被垃圾收集。
答案 1 :(得分:3)
理想情况下,自动内存管理器会释放对应用程序不再有用的对象。
已经证明,不可能以100%的准确度并且在所有情况下确定是否将在之后使用给定对象。相反,垃圾收集器使用“下一个最好的东西”,即它们释放不能可到达的对象:一个无法从应用程序访问的对象,因为缺少对该对象的引用路径,永远不会被应用程序再次使用,因为应用程序甚至无法注意到该对象仍然存在。这是一个近似值,但它是安全的:GC不会释放仍在使用的对象,但如果该对象看起来可以访问,它可能无法释放将不再使用的对象(即应用程序<如果愿意的话,em> may 仍然伸出并抓住对象。
“内存泄漏”是未使用的对象使用过多RAM的情况。什么是“过度”取决于应用程序。单个未使用的对象很少成为问题。通常重要的泄漏是未使用但可到达的对象累积数千的情况。
答案 2 :(得分:2)
典型的例子是事件监听器。每当注册事件侦听器时,都会保留对该类的引用。如果对象被释放但事件侦听器未注册,则由于对事件侦听器的引用,该对象永远不会从内存中释放。
更多信息: http://www.javaworld.com/javaworld/javatips/jw-javatip79.html
答案 3 :(得分:2)
可能发生这种情况的典型情况是,当您拥有静态地图时,该地图已填充,但从未清除。 Map不能被垃圾收集,因为它是静态引用的,并且Map中的条目不能被垃圾收集,因为它们是从Map中引用的。
答案 4 :(得分:1)
因为如果正在使用的对象仍然具有对您要收集的另一个对象的引用,则正在使用的对象仍然可以使用并对要对其进行垃圾回收的对象执行操作。如果一个对象没有用,那么应该删除对它的引用,以便可以对对象进行垃圾回收。
垃圾收集本身并不能防止内存泄漏。有些情况下很可能泄漏内存。您刚刚找到了其中一个场景。
答案 5 :(得分:0)
如果你有对象的引用,那么JVM应该如何知道它是“没用”?如果您不需要它,请删除引用,JVM可以告诉您不再打算使用它。 Java中的GC非常好,但它无法读懂您的想法或确定您的代码意图。
答案 6 :(得分:0)
这不是垃圾收集,因为JVM无法判断将来是否会跟踪该对象变量中的引用。在一般情况下,做出这样的决定需要JVM解决暂停问题。