内存溢出,内存泄漏,内存抖动你都碰到过吗?怎么解决的?如何区分这几种情况?怎么解决由内存泄漏而导致的内存溢出?
一、内存溢出:
(一)、定义:
内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出。
(二)、引起内存溢出的原因以及解决方案:
原因:
1.内存中加载的数据量过于庞大,如一次从数据库取出过多数据;
2.集合类中有对对象的引用,使用完后未清空,使得JVM不能回收;
3.代码中存在死循环或循环产生过多重复的对象实体;
4.使用的第三方软件中的BUG;
5.启动参数内存值设定的过小
解决方案:
第一步,修改JVM启动参数,直接增加内存。(-Xms,-Xmx参数一定不要忘记加。)
第二步,检查错误日志,查看“OutOfMemory”错误前是否有其它异常或错误。
第三步,对代码进行走查和分析,找出可能发生内存溢出的位置。
(三)、如何区分:
报错:提示“out of memory”。
二、内存泄漏:
(一)、定义:
内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。
(二)、引起内存泄漏的原因以及解决方案:
引起内存泄漏的场景:
- 资源对象没关闭造成的内存泄漏,如查询数据库后没有关闭游标cursor
- 构造Adapter时,没有使用 convertView 重用
- 对象被生命周期长的对象引用,如activity被静态集合引用导致activity不能释放
- Bitmap对象不再使用时,没有调用recycle()释放内存(?存在疑问)
(三)、如何区分:
内存泄露, 观察 momory monitor 出现,内存不断增加 然后降低.
工具使用:通过 heap viewer 查看
三、内存抖动:
(一)、定义:
内存抖动是指在短时间内有大量的对象被创建或者被回收的现象,内存抖动出现原因主要是频繁(很重要)在循环里创建对象。
(二)、引起内存抖动的原因以及解决方案:
内存抖动出现原因主要是频繁(很重要)在循环里创建对象,导致大量对象在短时间内被创建,由于新对象是要占用内存空间的而且是频繁,如果一次或者两次在循环里创建对象对内存影响不大,不会造成严重内存抖动这样可以接受也不可避免,频繁的话就很内存抖动很严重。内存抖动的影响是如果抖动很频繁,会导致垃圾回收机制频繁运行(短时间内产生大量对象,需要大量内存,而且还是频繁抖动,就可能会需要回收内存以用于产生对象,垃圾回收机制就自然会频繁运行了)。综上就是频繁内存抖动会导致垃圾回收频繁运行。
(三)、如何区分:
内存抖动: 通过momory monitor 发现 出现内存忽上忽下 形成针尖状的情况.