• 安卓 生命周期,内存泄露和MAT


    基础内容:

    测试工程的manifest文件中添加<Instrumentation>元素来指定要测试的应用程序
    签名机制
    只有相同签名才能运行在同一个进程中
    签名后能共享apk里面的acvitivy,view信息
    测试应用和被测应用运行在同一个进程里,它们之间就可以通过Instrumentation来进行消息交互
    am instrument -w
    InstrumentationTestRunner通过调用Instrumentation杀除应用程序的进程,再用Instrumentation重启该应用。这时,测试应用和被测应用就运行在同一进程下。
    使用Instrumentation,你可以在主程序启动之前,创建模拟的系统对象,如Contenxt。控制应用程序的多个生命周期

    Home          Back
    onPause     onPause
    onStop       onStop
    onRestart   onDestroy
    onStart      onCreate
    onResume  onStart

                     onResume

     

    常见的内存泄露问题

    1.资源对象没有关闭,比如数据库操作中得Cursor,IO操作的对象
    2.Context的泄露,比如我们在单例类中使用Context对象
    3.Bitmap泄露

    如浏览器的书签,历史网页图标都是先存入数据库,一般这个图标都会给非常小。

    但是有些网页会给很大,如果不压缩就存入,到时候点击进入书签页面,取图标的时候就会出现内存溢出,导致浏览器直接闪退。

    下面是压缩的例子:

     private final int MAX_SIZE =20*1024;//设置图片数据最大为20KB

    long length = entity.getContentLength(); //获取图片长度 if(length<=MAX_SIZE)
    length = MAX_SIZE; //当长度小于最大设定长度 图片长度等于最大长度 int factor = (int)(length /MAX_SIZE); //算出缩小的比例 如果小于最大长度就是 1/1 不缩小 BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = factor; options.inJustDecodeBounds =false ; //读取图片when false, 只读取宽高 设为true,这时候decode的bitmap为null Bitmap icon = BitmapFactory.decodeStream( content, null, options); //读出图片

    4.强引用导致无法回收

     用浏览器打开一些自己的广告文章,需要传一个activity进去,如果不做处理直接传activity打开文章,当浏览器back到后台,activity还是为1,没有释放,造成内存泄露。

    所有打开一些广告文章,可以先用实例化一个弱引用的activity,再用这个activity打开文章。后面会被自动回收,不会造成泄露

    new AdWebJumpHandler(this);//传入activity

    private static class AdWebJumpHandler implements WebJumpHandler { private WeakReference<BrowserActivity> mActivityRef; public AdWebJumpHandler(BrowserActivity activity){ mActivityRef = new WeakReference<BrowserActivity>(activity);//生成弱引用 } @Override public void onJump(String url, AdData adData, Bundle bundle) { BrowserActivity activity = mActivityRef.get();//获取弱引用的activity去打开url if(null != activity){ activity.openUrl(url); } } }

    MAT
    ● shallow heap:指的是某一个对象所占内存大小。
    ● retained heap:指的是一个对象的retained set所包含对象所占内存的总大小。

    1.Immediate Dorminator
    这是一个非常有用的功能,它的作用就是找出选择对象在Dominator Tree中的父节点。

    2.Merge Shortest Paths to GC Roots 可以查看一个对象到RC Roots是否存在引用链相连接, 在JAVA中是通过可达性(Reachability Analysis)来判断对象是否存活,这个算法的基本思想是通过一系列的称谓"GC Roots"的对象作为起始点,从这些节点开始向下搜索,搜索所走得路径称为引用链,当一个对象到GC Roots没有任何引用链相连则该对象被判定为可以被回收的对象,反之不能被回收,我们可以选择 exclude all phantom/weak/soft etc.references(排查虚引用/弱引用/软引用等)因为被虚引用/弱引用/软引用的对象可以直接被GC给回收.

    List object - With outgoing References 显示选中对象持有那些对象
    List object - With incoming References 显示选中对象被那些外部对象所持有
    Show object by class - With outgoing References 显示选中对象持有哪些对象, 这些对象按类合并在一起排序
    Show object by class - With incoming References 显示选中对象被哪些外部对象持有, 这些对象按类合并在一起排序



  • 相关阅读:
    云纵持续交付环境管理进化历程
    #研发解决方案#数据移山:接入、迁移、同步一站式
    如何快速判断一个人水平高低
    成长秘笈:是你教我,不是我教你
    年轻的工程师如何月入伍万XD
    Uber是如何重新思考GPS定位的(尤其是在城市峡谷中)
    当我们谈重构的时候我们想谈什么?
    #研发解决方案#异地多活让商户无感知
    乱是一种什么体验?
    新年技术团队寄语
  • 原文地址:https://www.cnblogs.com/season-xie/p/6360469.html
Copyright © 2020-2023  润新知