一、概念

内存溢出(Out Of Memory,简称OOM)是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于能提供的最大内存。此时程序就运行不了,系统会提示内存溢出,有时候会自动关闭软件,重启电脑或者软件后释放掉一部分内存又可以正常运行该软件,而由系统配置、数据流、用户代码等原因而导致的内存溢出错误,即使用户重新执行任务依然无法避免 。

内存溢出通俗理解就是内存不够,是指运行程序时要求的内存,超出了系统所能分配的范围,从而导致发生内存溢出。一般在运行大型软件时,所需的内存远远超出了主机内安装的内存所承受大小时就会发生这种情况。当出现内存溢出这种情况,系统一般会提示相关信息,有时候会自动关闭软件甚至会造成设备卡死等现象,重启电脑或者软件后释放掉一部分内存又可以正常运行该软件或游戏一段时间。

二、内存溢出的影响

当出现内存溢出这种情况,系统一般会提示相关信息,有时候会自动关闭软件甚至会造成设备卡死等现象,重启电脑或者软件后释放掉一部分内存又可以正常运行该软件或游戏一段时间。

三、溢出原因

造成这种现象的原因通常有两种:

  • 一种是由于长期保持某些资源的引用,垃圾回收器无法回收它,从而使该资源不能够及时释放,也称为内存泄露;
  • 一种是当需要保存多个耗用内存过大或当加载单个超大的对象时,该对象的大小超过了当前剩余的可用内存空间。

以Android程序为例:

  • 由强引用造成的内存溢出

若所有的引用都是强引用,则大量内存会被占用,最终导致内存溢出。
解决方法:使用弱引用或软引用,软引用的对象在内存不足时可被GC回收,弱引用的对象在垃圾回收时可被回收。

  • 由大量图片显示导致的内存溢出

为解决由大量图片显示造成的内存溢出,可以使用BitmapFactory.Options类,在返回参数时,只返回Bitmap的尺寸大小,而不将其加载到内存中,可有效减少内存溢出。同时在加载完后调用system. gc()通知系统及时回收。

  • 从数据库中取出大量数据造成的内存溢出

检查在数据库查询中,是否有一次获得全部数据的查询。一般而言,如果一次取十万条记录到内存,就可能引起内存溢出。该问题比较隐蔽,在上线前,数据库中数据较少,通常运行正常,上线后,数据库中数据增多,一次查询即有可能引起内存溢出。因此,对于数据库查询,尽量采用分页的方式查询。

  • 代码中存在死循环或循环产生过多重复对象实体造成的内存溢出

出现这种情况,只能通过查看日志找出产生该问题的原因,检查代码中是否有死循环、递归调用,或大循环重复产生的新对象实体。

注意与内存泄漏的区别。