Android提供了一个名为meminfo的小工具帮助应用分析自身的内存占用,并且在4.4还新增了memtrack HAL模块,SoC厂商通过实现memtrack模块,让meminfo可以获取GPU相关的一些内存分配状况。了解meminfo的实现,对我们更深入了解应用的内存占用状况是很有帮助的。而这篇文章的目的就是分析Android 4.4 meminfo的内部实现源码,让开发者通过这些信息可以更了解自己应用的内存占用状况。
在控制台输入命令"adb shell dumpsys meminfo YOUR-PACKAGE-NAME",可以看到类似下图的结果:
** MEMINFO in pid 14120 [com.UCMobile.test] **
Pss Private Private Swapped Heap Heap Heap
Total Dirty Clean Dirty Size Alloc Free
------ ------ ------ ------ ------ ------ ------
Native Heap 187886 187872 0 0 325232 174093 38594
Dalvik Heap 24801 24444 0 0 41476 35899 5577
Dalvik Other 700 700 0 0
Stack 508 508 0 0
Other dev 33564 32600 4 0
.so mmap 9019 1244 7268 0
.apk mmap 101 0 16 0
.ttf mmap 1330 0 696 0
.dex mmap 2248 0 2248 0
code mmap 985 0 188 0
image mmap 1182 908 12 0
Other mmap 130 4 108 0
Graphics 25504 25504 0 0
GL 2196 2196 0 0
Unknown 32476 32476 0 0
TOTAL 322630 308456 10540 0 366708 209992 44171
实际的调用代码入口在android.os.Debug.java和对应的CPP文件android_os_Debug.cpp,Debug.java的getMeminfo方法实际上调用了android_os_Debug.cpp的android_os_Debug_getDirtyPagesPid方法。
static void android_os_Debug_getDirtyPagesPid(JNIEnv *env, jobject clazz,
jint pid, jobject object)
{
stats_t stats[_NUM_HEAP];
memset(&stats, 0, sizeof(stats));
load_maps(pid, stats);
struct graphics_memory_pss graphics_me