OutofMemoryError的出现原因分析及解决方案内存溢出及泄露


首先报OOM的原因无外乎有两大类:一类是堆空间不足,另一类是元空间不足(直接内存)

堆空间不足

一、内存泄漏问题导致

1、内存泄漏:严格来说,只有对象不会再被程序用到了,但是GC又不能回收他们的情况,才叫内存泄漏,由于这些对象不能被垃圾收集掉,这样的对象多了,有可能就会OOM

举一个生活中的不太恰当的例子:假设你有一个妹妹她小时候买了一个很可爱的玩偶,现在她长大了,但是这个玩偶还是一直都没有扔掉它,家里人也不会去丢掉它 ,那么这样的玩偶多了,一直在家就可能把你家堆满(OOM)。这个例子里的这个玩偶就相当于一个没有引用的对象,这个对象(玩偶)程序都不用了,但是由于它和其中某一个有引用的对象有联系,所以垃圾回收时也不会去回收它。

内存泄漏出现的原因总结
(1)单例对象,这样存活时间很长的对象引用了使用时间很短的对象,那么这个被引用的对象就一直不能被回收,单例的生命周期和应用程序是一样长的,所以单例程序中,如果持有对外部对象的引用的话,那么这个外部对象是不能被回收的,则会导致内存泄漏的产生;
(2)各种连接资源对象,数据库连接(dataSourse . getConnection()),网络连接(socket)和io连接必须手动close,否则是不能被回收的,这些资源连接都要在finally{}中手动关闭;
(3)静态集合类,例子:

    static final ArrayList ARRAY_LIST = new ArrayList();
    public void addObject() {
   
        Object obj = new Object();// 原本obj对象对应的栈帧一出栈obj对象就会消除,未逃逸
        ARRAY_LIST.add(obj);     // 但是由于有静态集合的引用
  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值