性能优化3-内存优化工具实操.
adb 内存报告
meminfo 特定时间的内存分期
adb shell dumpsys meminfo 查看APP的内存分配情况
adb shell dumpsys meminfo 1343 1343是APP的pid
meminfo 配合watch 是不错的选择.固定时间对比来查看app的内存情况.
watch -n 5 dumpsys meminfo com.lakala.android
个人感觉这个命令更多的是查看对比的意义.或者你在进行一个操作前后生成两份报告.来对比内存变化.
pss 是APP私有内存和APP使用的共享库按比例分配的内存之和,比如有A,B两个进程都使用了 C这个共享内存.那么C占用的内存会按比例分配在 A和B的 Pss中.
uss 是APP的私有内存.
-
pss占用比例排队,占用越高的越在前边
内存报告1 -
oom 排队 ,约靠近下发的进程越容易被杀死,
报告2 - 整机pss分布,降序排列各类pss占用
-
打印特定进程信息
image.png
image.pngadb shell dumpsys meminfo
adb shell dumpsys meminfo [pid | packagename] 指定 pid或者 packageName来分析
Total PSS by process: java层内存使用情况. pss是用户进程内存+按比例分配的共享库,so文件内存
273,645K: system (pid 1071)
170,846K: com.android.systemui (pid 1677)
Total PSS by OOM adjustment:
400,194K: Native //就是系统为程序的OOM排序结果,OOM异常的时候会根据这个表单从下往上杀掉进程释放内存。
57,665K: android.hardware.graphics.allocator@2.0-service (pid 592)
34,576K: CameraDaemon (pid 747)
32,173K: android.hardware.graphics.composer@2.2-service (pid 593)
273,645K: System //按进程优先级分别来统计对应的进程及其内存使用情况
273,645K: system (pid 1071)
353,848K: Persistent //持久系统进程
170,846K: com.android.systemui (pid 1677)
43,835K: com.huawei.HwOPServer (pid 1858)
50,933K: Persistent Service
15,344K: com.android.bluetooth (pid 31551)
12,459K: com.huawei.nearby (pid 2307)
11,207K: com.huawei.iconnect (pid 2293)
304,581K: Foreground //前台系统进程
112,629K: com.huawei.android.launcher (pid 1914 / activities)
110,664K: com.huawei.intelligent (pid 4303)
263,575K: Visible
46,635K: com.google.android.gms.persistent (pid 3313)
43,081K: com.huawei.recsys (pid 3392)
108,364K: Perceptible
70,673K: com.baidu.input_huawei (pid 3593)
18,828K: android.process.acore (pid 17969)
17,167K: A Services
17,167K: com.android.settings (pid 15959)
8,280K: Previous
8,280K: com.google.process.gservices (pid 8556)
186,447K: B Services
40,067K: com.tencent.mobileqq:MSF (pid 6709)
36,461K: com.tencent.mm (pid 3627)
493,057K: Cached
63,156K: com.google.android.gms (pid 3903)
61,971K: com.android.gallery3d (pid 20172)
Total RAM: 5,838,092K (status normal)
Free RAM: 3,016,125K ( 493,057K cached pss + 2,047,496K cached kernel + 475,572K free)
Used RAM: 2,586,750K (1,967,034K used pss + 619,716K kernel)
Lost RAM: 1,030,267K
ZRAM: 92,028K physical used for 408,368K in swap (2,293,756K total swap)
Tuning: 384 (large 512), oom 322,560K, restore limit 107,520K (high-end-gfx)
*APP进程分为前台进程,缓存进程和后台进程
缓存进程是指APP不可见,也没有服务在运行,但是当前内存很充足,就保留的进程.
--这里留坑.还不太理解.
procstats 一段时间的内存分析
Procstats可以去监视你app在一段时间的行为,包括在后台(background)运行了多久,并在此段时间使用了多少内存
- adb shell dumpsys procstats com.lakala.android
列出过去24小时,3小时 当前所有状态下的统计
总内存:低水平/平均水平/高水平/私有内存:低水平/平均水平/高水平
这里的总内存和私有内存就是 pss和uss
部分说明
heap Dump
用来查看gc相关的信息,查看当前APP运行时都给什么样的类型分配了多少内存空间,这个工具在DDMS里.
使用方式
放大右边.是当前页面的内存分配,其中图片以byte[]方式占用内存
页面内存分配
- 堆内存 19.283mb
- 已分配内存 7.283mb
- 释放内存 12.00mb
- 使用率 37.77%
- 存活对象个数 138644
下边是一些详细数据.这个主要是用来看一看APP中内存的分配
上边的三个工具其实都是静态的查看内存的方式,更多是发现一些问题.但是没法具体定位的
mat
理解:这个工具是用来分析内存的,可以看到整个内存的分配情况和之间对象的引用情况.正确的用法是用来检测内存泄露.那么就是首先你要对觉得有内存泄露的地方进行分析.内存泄露在内存中的表现无非就是有对象无法释放.所以用软件的大概规则就是找到应该释放却没释放的对象.然后查找是哪里在引用他.从而定位位置.
几个好的文章.看完人家写的.真心感觉没有记录的必要了...
http://liuwangshu.cn/application/performance/ram-5-mat.html
https://zhuanlan.zhihu.com/p/27593816
内存分析工具,会生成一个hprof文件.这个文件在Android studio打不开 要在 sdk/platform-tools/hprof-conf 工具下进行转化
hprof-conv com.lakala.android.hprof test.hprof
把原来的转化成test.hprof 就可以用AndroidStudio打开了
这个文件在androidStudio上的效果不好.需要下载一个单独的MAT APP来看.下载地址.
https://www.eclipse.org/mat/downloads.php
浅堆(Shallow Heap)是指一个对象所消耗的内存,不包含任何他引用的其他对象的内存
深堆 (Retained Heap)是指一个对象所消耗的内存和只被他引用的其他对象的浅堆内存之和.
深堆可以理解为当这个对象被gc后所能清理出来的所有内存.