- VSS - Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)
- RSS - Resident Set Size 实际使用物理内存(包含共享库占用的内存)
- PSS - Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存)
- USS - Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)
一般来说内存占用大小有如下规律:VSS >= RSS >= PSS >= USS
2.收集内存信息的方式(1)dumpsys meminfo 进程名 效果同4
(2)top -m 5 -d 5 | grep 进程名
(3)使用ActivityManager的getMemoryInfo(ActivityManager.MemoryInfo outInfo) 主要是用于得到当前系统剩余内存的及判断是否处于低内存运行
(4)在代码中使用Debug的getMemoryInfo(Debug.MemoryInfo memoryInfo)或ActivityManager的MemoryInfo[] getProcessMemoryInfo(int[] pids)
该方式得到的MemoryInfo所描述的内存使用情况比较详细.数据的单位是KB.
MemoryInfo的Field如下
dalvikPrivateDirty: The private dirty pages used by dalvik。
dalvikPss :The proportional set size for dalvik.
dalvikSharedDirty :The shared dirty pages used by dalvik.
nativePrivateDirty :The private dirty pages used by the native heap.
nativePss :The proportional set size for the native heap.
nativeSharedDirty :The shared dirty pages used by the native heap.
otherPrivateDirty :The private dirty pages used by everything else.
otherPss :The proportional set size for everything else.
otherSharedDirty :The shared dirty pages used by everything else.
dalvik:是指dalvik所使用的内存。
native:是被native堆使用的内存。应该指使用C\C++在堆上分配的内存。
other:是指除dalvik和native使用的内存。但是具体是指什么呢?至少包括在C\C++分配的非堆内存,比如分配在栈上的内存。puzlle!
private:是指私有的。非共享的。
share:是指共享的内存。
PSS:实际使用的物理内存(比例分配共享库占用的内存)
(5)adb shell procrank(需要权限)
(6)adb shell cat /proc/meminfo 不能分进程获取
(7)adb shell ps -x 效果同(2)
3.内存泄露分析
3.1 java层使用 hprof文件+MAT分析工具
详见珍姐整理的Android端内存泄漏方法总结的第三部分:
3.2 native层 bionic
对于Android的native进程, Android源码中的Bionic库提供了一个很棒的API,get_malloc_leak_info用来检测Native代码内存泄露。
使用步骤:
1、使用小米开发版手机(自带libc_malloc_debug_leak.so),若使用其他手机需确保/system/lib下有libc_malloc_debug_leak.so文件。
2、命令行设置setprop libc.debug.malloc 1
3、kill需要检测的进程,使这个property设置后生效。
4、下载Dalvik debug monitor 18版本的tool文件夹,替换sdk目录下的tools,找到我们电脑home目录下的隐藏文件/home/user/.android在里面的ddms.cfg文件下加入一行native=true
5、启动sdk/tools目录下的ddms.bat,出现以下窗口,可以显示进程的native heap信息。
6、启动需要检测的进程,执行相关操作
7、分析两次native heap信息的差别,可以辅助定位native 内存泄露问题。