这是java内存泄漏吗

Posted

技术标签:

【中文标题】这是java内存泄漏吗【英文标题】:is this a java memory leak 【发布时间】:2013-01-08 01:46:44 【问题描述】:

更新:看起来这不是内存泄漏,有人会根据此示例的扩展创建吗? 原始问题: 假设我创建并启动了一个不会终止的线程,只要它还活着,线程就会创建一个对象和引用。请参阅以下代码。 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 还活着,GC 不应该销毁它。 这并不是真正的内存泄漏,您已经为线程分配了一个变量并让线程继续运行,虽然它可能毫无意义,因为它什么都不做,但它按设计运行。 我会说不。因为无论逻辑如何,对象仍在范围内,因此不符合收集条件。泄漏是当对象不再可访问但内存被保留时。在您的情况下,您可以在 while 之后使用可以使用 x 的代码。实际上在你的情况下 x 只是一个未使用的变量。 不是内存泄漏,只是语言的误用。 我在eclipse中试过这段代码...如何杀死这个线程? 【参考方案1】:

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

【讨论】:

【参考方案2】:

x 具有方法范围,并且在方法返回或您明确执行x = null 之前,将不会被垃圾收集。 不,这不会被视为泄漏。

【讨论】:

【参考方案3】:

jvm 垃圾会收集 x 吗?

不,因为线程仍然保持对它的引用。

这会被认为是内存泄漏吗?

不是真正的泄漏,而是内存的浪费。

【讨论】:

【参考方案4】:

来自Wiki

当对象存储在内存中但运行代码无法访问时,可能会发生内存泄漏。所以

would this be considered a memory leak?

不,这不是内存泄漏。

Would jvm garbage collect x ?

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

【讨论】:

以上是关于这是java内存泄漏吗的主要内容,如果未能解决你的问题,请参考以下文章

这是内存泄漏吗?

Java 内存不足。这不是内存泄漏吗?

java中会存在内存泄漏吗

从 python 中的共享库返回的数组 - 这是内存泄漏吗?

DialogFragment 泄漏内存

这是 std::vector 和 std::shared_ptr 内存泄漏的错误吗?