内存泄露与内存溢出傻傻分不清?帮你简单理清楚!

内存泄露与内存溢出都会导致内存无法得到合理的使用,只是之间确实有些差异,容易混淆。

简单来说,内存泄露是不需要存活的对象无法被回收占用内存。内存溢出是必要的对象没有足够的内存来创建。

内存泄露

内存泄漏(memory leak ):是指程序在申请内存后,无法释放已申请的内存空间就造成了内存泄漏,一次内存泄漏似乎不会有大的影响,但内存泄漏堆积后的后果就是内存溢出。

常见原因

当一个对象已经不需要再使用本该被回收时,另外一个正在使用的对象持有它的引用从而导致它不能被回收,这导致本该被回收的对象不能被回收而停留在堆内存中,这就产生了内存泄漏。

我的理解就是,因为编码问题,导致生命周期很短且本该回收的对象一直无法被gc。

举个例子

静态类实现单例模式。因为其生命周期和应用的生命周期一样长,所以如果在创建单例时,传入了其他对象,则该对象将一直无法被回收。

/**
 * 静态类实现单例模式,如果传入对象,则当前对象生命周期将与应用生命周期一致
 *
 * @author baijiaan
 * @date 2020-05-27
 */
public class SingleInstanceTest {

    private static SingleInstanceTest sInstance;
    private OneObject oneObject;

    private SingleInstanceTest(OneObject oneObject) {
        this.oneObject = oneObject;
    }

    public static SingleInstanceTest newInstance(OneObject oneObject) {
        if (sInstance == null) {
            sInstance = new SingleInstanceTest(oneObject);
        }
        return sInstance;
    }
}

内存溢出

内存溢出(out of memory): 指程序申请内存时,没有足够的内存供申请者使用,或者说,给了你一块存储int类型数据的存储空间,但是你却存储long类型的数据,那么结果就是内存不够用,此时就会报错OOM,即所谓的内存溢出,简单来说就是自己所需要使用的空间比我们拥有的内存大,内存不够使用所造成的内存溢出。

常见原因

内存溢出的原因比较宽泛:

  1. 可能是分配的内存本身就不够
  2. 一次性装载到内存的数据量过大
  3. 内存泄露使内存被不合理的占用导致可用内存不够
  4. 编码问题,比如进入了一个循环创建对象的情况
解决方法

对应上面的常见原因,我们大概的解决思路是:

  1. 修改-Xmx
  2. 防止一次性加载过多数据
  3. 找OutOfMemory异常来定位问题出现位置
  4. 养成良好的编码习惯

总结

个人理解,内存泄露是一种行为,而内存溢出是一个结果。内存溢出这个结果出现了,那系统就不能正常使用了。而偶尔的内存泄露不可怕,频繁的内存泄露可能会造成恶劣的后果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白码上飞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值