一、点击如图按钮,安装你要分析的app
Profile 'app'二、显示如下图片,分别是cpu渲染ui所花费的时间,内存占用情况,网络请求的状况。这里主要聊MEMORY。
Android Monitor三、测试内存泄
1.这里我故意动态注册了一个广播,没有注销。
内存泄漏代码2.多次开启关闭页面,然后手动GC(垃圾回收,下次聊一下垃圾回收),这里本来因为泄漏导致内存不会被回收,然后GC之后,内存占用情况应该不会减少,但是没有达到预期效果,很尴尬,没关系,这里我们去看当前堆栈的情况。
手动GC与查看当前堆栈的情况3.找到当前泄漏代码的类,点击,右边会出现有多次泄漏如图
出现内存泄漏好了这里你就可以用AS去检查内存泄漏了。
最后说下会造成内存泄漏的情况,以及解决方式
1.Handler,因为Handler和Message、MessageQueue的关系,如果有Message未被处理,那么未被处理的Message和Handler的引用会被MessageQueue持有。
解决方式:在使用Handler的界面销毁是调用removecallback()取消任务。
2.上下文,比如在静态代码里面传了上下文,由于静态的生命周期很长会导致上下文不会被回收。
解决方式:使用application的上下文
3.内部类,内部类会默认持有外部对象的引用
解决方式:内部类采用静态修饰。
4.注册但是未注销,例如广播
解决方式:注册之后,记得注销。
5.资源对象没有关闭,例如cursor,io流等
解决方式:调用close()、destroy()、recycler()等
5.向集合里面添加对象,没有置空
解决方式:在界面销毁的时候对象置空。
除了AS给我们提供的工具去检测内存泄漏,还有一些第三方也可以帮我们去检测内存泄漏,例如leakcanary。
网友评论