这是Java内存泄漏吗?

7

更新:看起来这不是内存泄漏,是否有人可以基于此示例的扩展来创建一个?
原始问题: 假设我创建并启动了一个不终止的线程,该线程创建一个对象并在其存活期间引用它。请参见以下代码。JVM会垃圾回收x吗? 这被认为是内存泄漏吗?

public class MyRunnable implements Runnable{

    public void run(){
      X x = new X();
      while(true){}
   }
}

Thread t = new Thread(new MyRunnable());
t.start();

对象 x 仍然存活,垃圾回收器不应该销毁它。 - Basile Starynkevitch
5
这并不是真正的内存泄漏,你已经将一个变量分配给一个线程并让这个线程一直运行着,虽然它可能是没有用的因为它什么也没做,但它正在按照设计运作。 - codeghost
1
这不是内存泄漏,只是语言的误用。 - assylias
那么...关闭 Eclipse? - codeMan
这不是内存泄漏,因为在这种情况下,对象x将保留在内存中。至少在代码的这个部分中,内存不会增加,也不会引发OOM错误。 - UVM
显示剩余9条评论
4个回答

5
线程从未终止,因此垃圾回收器永远不会释放 x。但是,如果您从未真正使用 x,它可能会被优化掉。如果您确实使用了 x,则这不可能是内存泄漏 - 您正在使用该内存。

0

来自维基百科

内存泄漏可能会发生在对象存储在内存中但无法被运行代码访问时。因此

would this be considered a memory leak?

不,这不是内存泄漏。

Would jvm garbage collect x ?

不行,因为线程永远不会结束。


0

x 具有方法作用域,直到方法返回或您明确执行 x = null,它才会被垃圾回收。这不会被视为泄漏。


0
JVM 会垃圾回收 x 吗?不会,因为线程仍然保持对它的引用。 这被认为是内存泄漏吗?不完全是泄漏,而是浪费了内存。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接