首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java内存泄漏?

Java内存泄漏?
EN

Stack Overflow用户
提问于 2016-01-16 05:48:09
回答 2查看 119关注 0票数 0

我想知道下面的代码是否导致了Java中的某种内存泄漏。总之,这是代码:

代码语言:javascript
复制
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;

    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-16 06:19:33

如果你给A打电话:

代码语言:javascript
复制
A a = new A();
//        1
a.x = new A(new A(new A(new A(a))));
//        2     3     4     5

然后你就有了一个圆形链:

代码语言:javascript
复制
a → 1 → 2 → 3 → 4 → 5 → 1

当您使用a.x.x = null打破圆圈时,您可以得到:

代码语言:javascript
复制
a → 1 → 2

实例3、4和5现在有资格进行垃圾收集。

然后,当main退出时,a超出了作用域,实例1和2也有资格进行垃圾收集。

请注意,程序很可能会在GC有机会做任何事情之前结束。

票数 5
EN

Stack Overflow用户

发布于 2016-01-16 06:17:07

该代码中没有内存泄漏。

a变量在main中超出作用域时,所有对象都是不可访问的,并有资格被垃圾收集。

我想知道把a.x.x设置为null是否失去了对a.x的多个x中其他x的引用,如果这有任何意义的话.

不多:-)

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

Java中的内存泄漏实际上是因为当您不希望对象被访问时,对象是可访问的;例如,当您通过将指向对象的链接保存在static集合中而“挂起”对象时。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34823971

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档