java中的内存泄漏

关于内存泄漏和内存溢出的区别,可以看这篇文章,写得不错。

http://blog.youkuaiyun.com/buutterfly/article/details/6617375


内存泄漏是指申请的内存没有及时的释放,这种情况一旦多了,使用的内存超出了可用内存数,就会发出内存溢出。也就是说内存泄漏可导致内存溢出。


面试时,一般会被问到java中是否存在内存泄漏。面试官的意思是和C++比起来如何。因为C++中的内存回收是需要开发人员时刻留意并手动回收的,一旦没有回收就会发出内存泄漏的情况。而Java里是由垃圾回收器自动回收内存空间,它检测到一个对象的引用类型是弱引用以下,就会回收这个对象。基于这个机制,我们可以发现,一个对象如果没有正确地被修改引用,就有可能发生内存泄漏


关于java中对象的四种引用类型(强、软、弱、虚),请参考这篇:
http://blog.youkuaiyun.com/coding_or_coded/article/details/6603549


内存泄漏出现场景

原因已经明了,再来分析一下出现的场景
因为只有强引用可能会导致内存溢出,软引用在内存吃紧时也会被回收,所以我们只讨论强引用下的内存泄漏场景。

1、静态集合变量
public class ClassName{
    Static List list = new ArrayList(); 
    for (int i = 1; i<100; i++) 
    { 
        Object o = new Object(); 
        list.add(o); 
        o = null; 
    }
}
以上的代码是很危险的,因为这个类保存着集合的强引用,集合内又保存着这100个对象的强引用,o = null;并没有改变这种引用关系,最后导致这些对象的生命周期和应用程序一致了。

2、 内部类和外部类的引用
一句话点明:非静态内部类拥有外部类对象的强引用

3、基于哈希表的集合
请参考我的另一篇: java中的HashSet和TreeSet的区别,以及HashSet导致的内存泄漏详解,最后一部分
http://blog.youkuaiyun.com/xingjiyuan26/article/details/49514631
场景是:把一个对象存储进HashSet集合后,修改这个对象中参与计算hash的变量的值,这个对象不能被正常地remove或contains。

4、监听器和资源连接
在不用的时候,没有解绑监听器或关闭连接,比如数据库连接, Resultset Statement 对象和IO流连接

总结:Java中是存在内存泄漏的情况的,这主要是和对象的引用有关。对于以上4种或更多地场景,我们要特别注意对象的引用,在不需要一些对象时,要及时通过代码修改这些对象的引用为非强可及的才行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值