我想知道下面的代码是否导致了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;
}
}发布于 2016-01-16 06:19:33
如果你给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有机会做任何事情之前结束。
发布于 2016-01-16 06:17:07
该代码中没有内存泄漏。
当a变量在main中超出作用域时,所有对象都是不可访问的,并有资格被垃圾收集。
我想知道把
a.x.x设置为null是否失去了对a.x的多个x中其他x的引用,如果这有任何意义的话.
不多:-)
Java中正确的内存管理不依赖于不丢失对其他事物的引用的东西..。或者不是。最重要的规则是,如果任何正在执行的代码都无法到达一个对象,它就不会影响计算,并且有资格被垃圾收集。当有必要时,GC会处理一个无法到达的对象.但通常是在它选择的时候。
Java中的内存泄漏实际上是因为当您不希望对象被访问时,对象是可访问的;例如,当您通过将指向对象的链接保存在static集合中而“挂起”对象时。
https://stackoverflow.com/questions/34823971
复制相似问题