更新:看起来它不是内存泄漏,是否有人根据此示例的扩展创建?
原始问题:
假设我创建并启动一个不终止的线程,线程创建一个对象并引用,只要它还活着。请参阅以下代码。 JVM垃圾会收集x
吗?
这会被视为内存泄漏吗?
public class MyRunnable implements Runnable{
public void run(){
X x = new X();
while(true){}
}
}
Thread t = new Thread(new MyRunnable());
t.start();
答案 0 :(得分:5)
线程永远不会终止,因此垃圾收集器永远不会释放x
。但是,如果您从未真正使用x
它,它可能会被优化。如果你使用x,这不能是内存泄漏 - 你使用内存。
答案 1 :(得分:0)
x
具有方法范围,并且不会在方法返回或您明确执行x = null
之前进行垃圾回收。
并且不会将此视为泄漏。
答案 2 :(得分:0)
jvm垃圾收集x?
不,原因线程仍然保持对它的尊重。
这会被视为内存泄漏吗?
不是真正的泄漏,而是浪费记忆。
答案 3 :(得分:0)
来自Wiki
当对象存储在内存中但运行代码无法访问时,可能会发生内存泄漏。所以
would this be considered a memory leak?
不,这不是内存泄漏。
Would jvm garbage collect x ?
不,因为线程永远不会结束。