黑马程序员技术交流社区

标题: java内存泄漏问题,求高手解决! [打印本页]

作者: 薄炳鑫    时间: 2012-6-29 23:52
标题: java内存泄漏问题,求高手解决!
本帖最后由 薄炳鑫 于 2012-6-30 17:10 编辑

下面的代码是一个内存泄漏的问题,但是我看不懂。求高手给我解释一下内存泄漏的问题,怎么避免内存泄漏。
class A{
public A(){
B.getInstance().setA(this);
}
}
//B采用单例设计模式
class B{
private A a;
private static B instance = new B();

public B(){}

public static B getInstance(){
return instance;
}

public void setA(A a){
this.a = a;
}
}
高手给把这个代码的内存泄漏也分析一下哇。
作者: 刘蕴学    时间: 2012-6-30 15:01
本帖最后由 刘蕴学 于 2012-6-30 15:04 编辑



我这个是运行时的跟踪
ao一直是一个,就是你的那个a,我想他说的意思是,比如你的ao是在别的地方存在的,当你把ao指空并期望他被回收的时候,在bo里你还有一个ao存在,由于单例是运行时始终存在的,所以这个ao始终会存在。

假设你有几十单例实现,就会导致额外的很多内存开销。这是不推荐的。

单例正确使用方法你可以参考Runtime类,对于单例来说,由于他的生命周期是整个运行时,所以不应该在其实现上使用非本类单例对象的其他对象引用。




作者: 薄炳鑫    时间: 2012-6-30 17:00
刘蕴学 发表于 2012-6-30 15:01
我这个是运行时的跟踪
ao一直是一个,就是你的那个a,我想他说的意思是,比如你的ao是在别的地方存在的, ...

是不是由于B对象的存在导致A对象也必须存在,不能CG回收。
在构建单例的时候不要引用其他对象,我这样理解对吗?
作者: 刘蕴学    时间: 2012-6-30 17:03
薄炳鑫 发表于 2012-6-30 17:00
是不是由于B对象的存在导致A对象也必须存在,不能CG回收。
在构建单例的时候不要引用其他对象,我这样理 ...

gc回收的情况是没有引用指向对象,如果你在单例里有引用的话,单例对象一直存在,就导致你这个对象也一直有最少一个引用,所以不会被垃圾回收
作者: 薄炳鑫    时间: 2012-6-30 17:09
刘蕴学 发表于 2012-6-30 17:03
gc回收的情况是没有引用指向对象,如果你在单例里有引用的话,单例对象一直存在,就导致你这个对象也一直 ...

这下明白了这个GC的回收机制,谢谢了啊。
作者: 孙浩迪    时间: 2012-6-30 17:49
薄炳鑫 发表于 2012-6-30 17:09
这下明白了这个GC的回收机制,谢谢了啊。

这个哪内存泄露了啊,,  高手教一下啊, 看不懂, 就看是个单例, 复制到Eclipse也运行不了。。。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2