Java中的内存泄漏?
我想知道下面的代码是否在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(
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的引用,如果这有意义的话…谢谢,这个回答非常有启发性和帮助性。哦,好的,这很有意义,非常清楚/信息丰富,谢谢!