Android内存优化

# 内存占用情况的分析

作为系统端而言,在一个资源受限的系统上,应用内存优化的优先级可以通过占用排名TOP10来衡量。这里从系统角度出发,对应用内存的占用情况的分析通过以下三步走。

1、procrank看排名

Android调试状态下一般都包含procrank工具,如果默认没有,移植编译都是值得的。

1
2
3
4
5
6
7
8
9
10
11
130|root@Hi3751V500:/ # procrank PID Vss Rss Pss Uss cmdline
2481 1018200K 138932K 90665K 83608K com.mgtv.mgui
1978 940364K 73608K 36234K 31456K system_server
2116 888956K 77416K 28661K 21492K com.android.systemui
2397 863640K 49352K 19322K 17564K com.mgtv.surveyor
2232 881108K 50364K 17368K 14560K com.sohu.inputmethod.sogou.tv
2821 876556K 49552K 16775K 14160K com.audiocn.kalaok.tv.k66
2100 857660K 43712K 11614K 8480K com.hisilicon.tv.service
2911 872916K 41652K 10627K 8144K com.hpplay.happyplay.aw
2570 853600K 39432K 10254K 8692K com.mgtv.setting
1486 825108K 48552K 9259K 4460K zygote

从输出看,含有Vss, Rss, Pss, Uss几个参数,他们的含义可以参考:

1
2
3
4
5
VSS- Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)
RSS- Resident Set Size 实际使用物理内存(包含共享库占用的内存)
PSS- Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存)
USS- Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)
一般来说内存占用大小有如下规律:VSS >= RSS >= PSS >= USS

从系统角度上看,使用pss来含量是最公平合理的。

2、借助Monitors来查看内存的动态使用情况,找到峰值

Android Studio提供了很好的监控工具Monitors,借助他,可以一边操作应用,一边查看内存占用,找到可能出现的峰值,这个值可能就是我们要攻克的高地。

但是这里的内存占用大小其实是堆内存大小,虽然如此,这个值的变化也可以告诉我们什么时候会发生峰值,已经占用的结构是怎么样的。

3、分析堆转储,定位占用结构

定位了占用内存较高的应用之后,就需要占用内存较高的模块了。通过获取和分析堆转储,可以定位占用的结构。

1
2
3
➜ ~ adb shell am dumpheap com.mgtv.surveyor /data/surveyor.hprof
➜ ~ adb pull /data/surveyor.hprof .
➜ ~ hprof-conv surveyor.hprof surveyor_conv.hprof

使用MAT工具分析hprof文件:

Google I/O 内存管理讲解