一:内存溢出:程序在申请内存时,没有足够的内存空间供其使用,比如Interger申请到的内存空间,却要存long才能放下的数据
简单理解就是:我给你分配的地方就这么多,你超过了就溢出了
二:内存泄漏:指程序申请到内存空间后,无法释放已经申请的内存空间,积累多了,再多的内存都会被占进
三:内存泄漏并不会导致程序功能异常,但会导致Android程序内存占用过大,这将提高内存溢出发生的几率。
四:内存溢出的解决方案:
1:直接修改jvm启动参数,增加其内存
2:检查错误日志,看在OutOfMemory之前有什么异常或错误
3:对代码进行走查和分析,找出可能存在泄漏的点
重点排查以下几点:
1.检查对数据库查询中,是否有一次获得全部数据的查询。一般来说,如果一次取十万条记录到内存,就可能引起内存溢出。这个问题比较隐蔽,在上线前,数据库中数据较少,不容易出问题,上线后,数据库中数据多了,一次查询就有可能引起内存溢出。因此对于数据库查询尽量采用分页的方式查询。
2.检查代码中是否有死循环或递归调用。
3.检查是否有大循环重复产生新对象实体。
4.检查对数据库查询中,是否有一次获得全部数据的查询。一般来说,如果一次取十万条记录到内存,就可能引起内存溢出。这个问题比较隐蔽,在上线前,数据库中数据较少,不容易出问题,上线后,数据库中数据多了,一次查询就有可能引起内存溢出。因此对于数据库查询尽量采用分页的方式查询。
5.检查List、MAP等集合对象是否有使用完后,未清除的问题。List、MAP等集合对象会始终存有对对象的引用,使得这些对象不能被GC回收。
第四步,使用内存查看工具动态查看内存使用情况