Java中的内存泄漏?

时间:2016-01-16 05:48:09

标签: java memory-leaks

我想知道以下代码是否在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;

    }
}

2 个答案:

答案 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集合中保持与它们的链接。