A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 薄炳鑫 黑马帝   /  2012-6-29 23:52  /  2100 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 薄炳鑫 于 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;
}
}
高手给把这个代码的内存泄漏也分析一下哇。

5 个回复

正序浏览
薄炳鑫 发表于 2012-6-30 17:09
这下明白了这个GC的回收机制,谢谢了啊。

这个哪内存泄露了啊,,  高手教一下啊, 看不懂, 就看是个单例, 复制到Eclipse也运行不了。。。
回复 使用道具 举报
刘蕴学 发表于 2012-6-30 17:03
gc回收的情况是没有引用指向对象,如果你在单例里有引用的话,单例对象一直存在,就导致你这个对象也一直 ...

这下明白了这个GC的回收机制,谢谢了啊。
回复 使用道具 举报
薄炳鑫 发表于 2012-6-30 17:00
是不是由于B对象的存在导致A对象也必须存在,不能CG回收。
在构建单例的时候不要引用其他对象,我这样理 ...

gc回收的情况是没有引用指向对象,如果你在单例里有引用的话,单例对象一直存在,就导致你这个对象也一直有最少一个引用,所以不会被垃圾回收
回复 使用道具 举报
刘蕴学 发表于 2012-6-30 15:01
我这个是运行时的跟踪
ao一直是一个,就是你的那个a,我想他说的意思是,比如你的ao是在别的地方存在的, ...

是不是由于B对象的存在导致A对象也必须存在,不能CG回收。
在构建单例的时候不要引用其他对象,我这样理解对吗?
回复 使用道具 举报
本帖最后由 刘蕴学 于 2012-6-30 15:04 编辑



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

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

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



回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马