android 内存溢出(oom)产生原因和内存优化
来源:互联网 发布:淘宝2016版本5.7.0下载 编辑:程序博客网 时间:2024/06/05 04:16
android内存溢出的原因:
android使用基于寄存器的Dalvik虚拟机,每个android应用单独使用一个Dalvik虚拟机,每个虚拟机使用的堆内存是有限的,超过了限制就会引发oom错误。产生oom的原因大约是:1、长期保存某些大型资源的应用,资源得不到释放(比如Contextg);2、使用了多个Bitmap
容易造成oom的情况:
1、不恰当的使用static关键字。静态变量时属于类而不是对象,所以使用static保存大资源(比如Context)非常容易造成oom。
解决方案:
尽量不要使用static 变量保存大资源(比如Context等)
使用软应用
使用application Context
2、内部类线程引发oom。 线程的生命周期不可控,在线程没有完成run方法之前线程不会被销毁,同事由于采用内部类产生的线程同时用保存Activity的引用。同理使用Activity的内部类Asyncatask也容易造成oom
解决方案:
将内部类线程改为静态内部类
在线程内部使用弱引用保存Context引用,解决模型如下:(转)
- public abstract class WeakAsyncTask<Params, Progress, Result, WeakTarget> extends
- AsyncTask<Params, Progress, Result> {
- protected WeakReference<WeakTarget> mTarget;
- public WeakAsyncTask(WeakTarget target) {
- mTarget = new WeakReference<WeakTarget>(target);
- }
- /** {@inheritDoc} */
- @Override
- protected final void onPreExecute() {
- final WeakTarget target = mTarget.get();
- if (target != null) {
- this.onPreExecute(target);
- }
- }
- /** {@inheritDoc} */
- @Override
- protected final Result doInBackground(Params... params) {
- final WeakTarget target = mTarget.get();
- if (target != null) {
- return this.doInBackground(target, params);
- } else {
- return null;
- }
- }
- /** {@inheritDoc} */
- @Override
- protected final void onPostExecute(Result result) {
- final WeakTarget target = mTarget.get();
- if (target != null) {
- this.onPostExecute(target, result);
- }
- }
- protected void onPreExecute(WeakTarget target) {
- // No default action
- }
- protected abstract Result doInBackground(WeakTarget target, Params... params);
- protected void onPostExecute(WeakTarget target, Result result) {
- // No default action
- }
- }
3、Bitmap使用,使用数量多的Bitmap极易造成oom错误
解决方案:
及时销毁Bitmap,bitmap不在使用的时候及时Recycle
设定采样率,使用BitmapFactory处理Bitmap再使用
使用软应用,如果使用一个Bitmap却没有保留他的引用那么则没有办法调用recycle方法,使用软应用可以使bitmap在内存不足的时候得到释放
4、游标cursor的使用
使用游标cursor完毕应该及时关闭cursor
使用cursorAdapter的情况下应该在Activity的ondestory中调用cursor的close方法
5、其他情况
使用9path代替大图
adapter中使用convertView
0 0
- android 内存溢出(oom)产生原因和内存优化
- 【Android性能优化】内存泄露和内存溢出(OOM)的引发原因及优化方案
- 【Android性能优化】内存泄露和内存溢出(OOM)的引发原因及优化方案
- 【Android性能优化】内存泄露和内存溢出(OOM)的引发原因及优化方案
- 【Android性能优化】内存泄露和内存溢出(OOM)的引发原因及优化方案
- Android内存泄漏产生的原因以及解决方案(OOM)
- Android内存泄漏产生的原因以及解决方案(OOM)
- Android内存溢出(OOM)
- android OOM 内存溢出
- 内存泄漏(OOM)产生原因
- Android oom和内存优化
- Android:内存溢出和内存泄漏的区别、产生原因以及解决方案
- Android 内存溢出解决方案(OOM)
- Android中 内存溢出解决方法(OOM)
- Android 内存溢出解决方案(OOM)
- Android 内存溢出(OOM)解决方案总结
- Android 内存溢出解决方案(OOM)
- Android 内存溢出解决方案(OOM)
- 导视系统设计欣赏
- 对于retain和assign属性的理解
- PostgreSQL 序列(SEQUENCE)
- 【安卓笔记】touch事件的分发和消费机制
- NYOJ45 棋盘覆盖
- android 内存溢出(oom)产生原因和内存优化
- cocos2d-x jsb 防止触摸事件传递
- 动态添加标题和Viewpager,标题和ViewPager联动滑动
- lucene4.1 小例子 全文检索
- php 做图像报表
- 【JavaScript】encodeURI() 函数
- Hadoop2.2.0已经遗弃的属性名称
- iOS基础面试题(四)
- android 截屏功能分析