android内存泄露总结

本文详细介绍了Android中解决内存溢出的方法,包括分析工具的使用、WebView内存泄露处理及常见内存泄露问题。提供了具体的代码优化建议和技术解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

解决内存溢出方法:
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工具使用相关

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

method_chen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值