解决内存溢出方法:
1.强引用导致内存不释放。
相关描述:1.强引用(正常赋值的)、软引用(高速缓存、可被回收)、弱引用(gc的时候回收,不影响原对象垃圾收集)
解决方法:找到强引用不释放的地方改成弱引用,leakcanary分析
2.WebView是否会导致内存溢出
会,见下面参考文章,WebView内存泄露
3.内存分析工具ddms、mat分析
(一)ddms堆内存分析
(二)Android Monitor Memory 监控
(三) mat工具使用
用android device monitor 导出com.jd.paipai.hprof文件
需要转换,工具为SDK目录下:android\sdk\platform-tools\hprof-conv.exe
命令:hprof-conv 原文件名 转换后的文件名
如:hprof-conv com.jd.paipai.hprof converst-file.hprof
用Memory Analyzer 分析内存情况
(四)leakcanary分析
4.将Activity更改启动模式。singleInstance
第一次是创建新的activity,第二次如果原来的没关闭,会调用
onNewIntent()方法
5.常见的内存泄露问题有哪些。
常见问题:
(一) 查询数据库没有关闭游标
(二) 构造Adapter时,没有使用缓存的 convertView
(三) Bitmap对象不在使用时调用recycle()释放内存
(四) 释放对象的引用
(五)static 关键字
(六)内部类多线程
解决方法:
1.用LeakCanary找出引用导致不释放的问题。
2.对物详页的定时器,采用外部的全局的服务器时间。对定时器优化。
3.代码优化、图片的大小问题。移动端容纳的内存小。
4.图片降低质量
1. InputStream is = this.getResources().openRawResource(R.drawable.pic1);
BitmapFactory.Options options=new BitmapFactory.Options();
options.inJustDecodeBounds = false;
options.inSampleSize = 10; //width,hight设为原来的十分一
Bitmap btp =BitmapFactory.decodeStream(is,null,options);
2. if(!bmp.isRecycle() ){
bmp.recycle() //回收图片所占的内存
system.gc() //提醒系统及时回收
}
上面代码与下面代码大家可分开使用,也可有效缓解内存问题
/**
* 以最省内存的方式读取本地资源的图片
*/
public static Bitmap readBitMap(Context context, int resId){
BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inPreferredConfig = Bitmap.Config.RGB_565;
opt.inPurgeable = true;
opt.inInputShareable = true;
//获取资源图片
InputStream is = context.getResources().openRawResource(resId);
return BitmapFactory.decodeStream(is,null,opt);
}
内存溢出根本原因:
- 由于我们程序的失误,长期保持某些资源(如Context)的引用,造成内存泄露,资源造成得不到释放。
- 保存了多个耗用内存过大的对象(如Bitmap),造成内存超出限制。
内存溢出常见原因:
1.代码不规范,写功能,开发的时候着急,没有考虑太多,就直接用了,特别是对象重复创建的时候,多线程处理的时候。
2.在activity中有超过activity本身生命周期的对象的引用,导致activity的回收超过他自己的finish。
相关参考:
android常见内存泄露总结
android 内存溢出问题分析
静态内部
类和非静态内部类
WebView内存泄露
mat工具使用相关