内存溢出和内存泄露

内存溢出

内存溢出是相对于内存泄露来说的,尽管这样更容易理解,但是同样的,内存溢出也是引发程序奔溃的罪魁祸首之一。

就是内存不够用

由于GC一直发展,所以一般情况下,除非应用程序占用的内存增长速度非常快,造成垃圾回收已经跟不上内存消耗的速度,否则是不太容易出现OOM (OutofMemoryError)的情况。

大多数情况下,GC会进行年龄段的垃圾回收,实在不行就来一次独占式的Full GC的操作,这时候就会回收大量的内存,供应运程序继续使用。

javadoc中对OutifMemoryError的解释是,没有空闲内存,并且垃圾收集器也无法提供更多的内存。

内存泄露

内存泄露也叫做“存储渗漏”。严格的来说,只有对象不会再被程序用到了,但是GC又不能回收他们的情况,才叫内存泄露。

但实际的情况很多时候一些不太好的实践(或疏忽)会导致对象的生命周期变得很长甚至导致OOM,也可以叫做宽泛意义上的“内存泄露”。

尽管内存泄露并不会立刻导致程序的崩溃,但是一旦发生内存泄露,程序中的可用内存就会被逐步蚕食,直至内存耗尽所有,最终出现OutofMemory异常,最终到时程序奔溃。

注意,在这里的存储空间并不是指物理内存,而是指虚拟内存的大小,这个虚拟内存大小取决于磁盘交换区设定的大小。

例如:

  1. 与数据库连接完毕之后,需要关闭连接的通道,但是没有关闭。
  2. IO读写完成后没有关闭
  3. 单例模式:单例的生命周期和应用程序一样长,所以在单例程序中,如果持有对外部对象的引用的话,那么这个外部对象是不能被回收的,则会导致内存泄露的产生。
  4. 一些提供close()的资源 未关闭导致内存泄露。
  5. 数据库连接dataSourse.getConnection(),网络连接socket和io连接必须手动close,否则是不能被回收的。
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值