这是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内存泄漏吗的主要内容,如果未能解决你的问题,请参考以下文章