我想知道以下代码是否在Java中产生了某种内存泄漏。无论如何,这里是代码:
public class test {
public static void main(String[] args){
A a = new A();
a.x = new A(new A(new A(new A(a))));
a.x.x = null;
}
}
class A{
public A x = null;
A() {}
A(A a){
x = a;
}
}
答案 0 :(得分:4)
如果你给A编号:
A a = new A();
// 1
a.x = new A(new A(new A(new A(a))));
// 2 3 4 5
然后你有一个循环链:
a → 1 → 2 → 3 → 4 → 5 → 1
当您使用a.x.x = null
打破圈子时,您会得到:
a → 1 → 2
实例3,4和5现在有资格进行垃圾回收。
然后,当main
退出时,a
超出范围,实例1和2也有资格进行垃圾回收。
请注意,程序可能会在GC有机会做任何事情之前结束。
答案 1 :(得分:0)
该代码中没有内存泄漏。
当a
中的main
变量超出范围时,所有对象都将无法访问,并且有资格进行垃圾回收。
我想知道将
a.x.x
设置为null
是否会丢失对x
多个{{1}内的其他a.x
的引用如果这有任何意义的话......
不是很多: - )
Java中的正确内存管理依赖不会丢失对其他内容的引用......或者不会。最重要的规则是,如果任何执行代码都无法再访问某个对象,则它不会影响计算,并且符合条件的将被垃圾回收。 GC将处理一个无法访问的对象,并在必要时...但通常在其选择时。
Java中的内存泄漏实际上是因为当您不想要它时可以访问对象;例如当你"挂在"对象通过在x
集合中保持与它们的链接。