Java中的内存泄漏?

Java中的内存泄漏?,java,memory-leaks,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(

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

    }
}

该代码中没有内存泄漏

main
中的
a
变量超出范围时,所有对象都将无法访问,并且有资格进行垃圾收集


我想知道将
a.x.x
设置为
null
是否会丢失对
a.x
中其他
x
的多个
x
的引用,如果这样做有意义的话

不多:-)

Java中正确的内存管理不依赖于不丢失对其他事物的引用。。。或者不是。最重要的规则是,如果一个对象不再能够被任何执行代码访问,它就不能影响计算,并且它有资格被垃圾收集。GC将处理一个不可访问的对象,如有必要。。。但通常在选择的时候

Java中的内存泄漏实际上是因为当您不希望对象是可访问的时,对象是可访问的;e、 g.当您通过在
静态
集合中保留指向对象的链接来“挂起”对象时。

如果您对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有机会做任何事情之前结束。

在我看来,这是一个非常标准的链表。为什么会有内存泄漏?你确定有泄漏吗?看起来不错。是什么让你想到了一个在哪里?如果你不想保留
a.x
,就会有一种漏洞。如果你真的想保留它,那没关系。另外,没有泄漏,因为
a
在方法结束时超出范围,因此您创建的所有对象都可以收集,但我认为这不是您想问的问题;我想知道将a.x.x设置为null是否会丢失对a.x的多个x中其他x的引用,如果这有意义的话…谢谢,这个回答非常有启发性和帮助性。哦,好的,这很有意义,非常清楚/信息丰富,谢谢!