安卓 生命周期,内存泄露和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 显示选中对象被哪些外部对象持有, 这些对象按类合并在一起排序



 

posted @ 2017-02-01 22:46  q55091  阅读(227)  评论(0编辑  收藏  举报