Mac 下使用 adb 分析应用内存使用

来源:互联网 发布:数据挖掘课程设计 编辑:程序博客网 时间:2024/06/05 05:44

通过adb命令能获得手机的很多内容
本文介绍的是 adb shell dumpsys meminfo “packageName” 命令

前排提示,史前巨坑。
之前模拟器测试,现在用魅族 m1 ,正确代码销毁 Activity,结果 Activity 不管系统还是手动 GC 根本回收不了,又用回了模拟器才正常。
网上说,小米 和 flyme 系统,还有一些低端 rom 会出现这种情况。

首先来个案例先

新建一个工程,此处我的包名为 com.xiao.test,有一个 MainActivity 和一个 SecondActivity,其中 MainActivity 有一个按钮只是用来跳转到 SecondActivity。

启动程序,在终端中输入

adb shell dumpsys meminfo com.test.xiao

图中红框上一部分是内存的具体使用情况,红框内显示出最容易泄漏的对象 Activity。现在我们只启动了一个 MainActivity,图中也正是一个 Activity 对象,一切正常。
接着,点击 MainActivity 中的一个按钮启动 SecondActivity,此时 SecondActivity 没有做任何事,继续在终端中输入

adb shell dumpsys meminfo com.test.xiao

OK,不错,一切正常。注意 ViewRootImpl 和 Activity 是 1 :1关系的
接着按 back 键结束 SecondActivity,严谨一点此时应该手动GC的,但是现在只是很简单的功能,系统 GC 也来得及。输入 adb命令,此时的 Activites 数量又变为 1,这里就不贴图了。

接下来在 SecondActivity 的 onCreate() 加一段典型会内存泄漏的代码

new Handler().postDelayed(new Runnable() {    @Override    public void run() {    // 设置一个20秒后执行的空任务    }}, 20000);

退出应用重新来一遍

启动 MainActivity,再启动 SecondActivity,然后立即 back 返回结束掉 SecondActivity,此时 Handler 还有任务未结束,所以肯定是内存泄漏了,这个 Activity 对象就回收不了。
再来一遍命令

adb shell dumpsys meminfo com.test.xiao

果然没回收 Activity 对象。而且 ViewRootImpl 和 Activites 已经不是 1 :1关系了。

这样就有个简单的测试内存泄漏的方法:

运行程序,各个功能跑一遍,确保没有改出问题,完全退出程序,手动触发GC,然后通过 adb shell dumpsys meminfo packagename 查看Activites 和Views 的数量是否趋近于0,还有 ViewRootImpl 和 Activites 的比例是否正常。
0 0