【问题标题】:is this a java memory leak这是java内存泄漏吗
【发布时间】: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中试过这段代码...如何杀死这个线程?

标签: java garbage-collection jvm


【解决方案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 ?
        

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

        【讨论】:

          猜你喜欢
          • 2011-02-20
          • 2013-08-12
          • 2020-06-27
          • 2013-11-12
          • 2015-05-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多