Android系统提供了很多方法来获取当前系统以及指定进程的内存状态。在此进行说明。
1.使用相关工具获取
1)DDMS。System Information->Memory usage
2) APT 插件,监视内存及CPU使用。
3) adb dumpsys 命令:
adb shell dumpsys meminfo <package_name>
其中,package_name 也可以换成程序的pid,pid可以通过 adb shell top | grep app_name 来查找
或者使用 adb shell ps 查看当前终端中的进程信息
4) adb shell procrank 命令 (部分手机不支持)
2.通过代码获取
//系统内存情况
MemoryInfo mi = new MemoryInfo(); //android.app.ActivityManager.MemoryInfo
ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE); //android.app.ActivityManager
activityManager.getMemoryInfo(mi);
availableMegs = mi.availMem / 1048576L; //可用内存,字节为单位,转换为以MB为单位1048576=1024*1024
totalMegs=mi.totalMem/1048576L; //总内存
MemoryInfo的官网说明:http://developer.android.com/reference/android/app/ActivityManager.MemoryInfo.html
共有4个成员变量:
1.public long availMem: 系统当前可用内存
2.public boolean lowMemory: 系统是否认为当前是低内存状态
3.public long threshold: 低内存阈值,当可用内存低于这个阈值时,系统任务当前是低内存状态,lowMemory为真。此时系统会终止某些后台进程以及其他非外来服务(start killing background services and other non-extraneous processes)(这个地方我也不是特别清楚被干掉进程的优先级,待补充)
4.public long totalMem: 系统全部内存
//指定进程内存情况
Debug.MemoryInfo curMemInfo[]=new Debug.MemoryInfo[1]; //android.os.Debug.MemoryInfo
curMemInfo=activityManager.getProcessMemoryInfo(pids); //android.app.ActivityManager.getProcessMemoryInfo(int pid[ ]),跟据PID获取指定进程的内存信息,存储到android.os.Debug.MemoryInfo中
Debug.MemoryInfo的官方说明:http://developer.android.com/reference/android/os/Debug.MemoryInfo.html
该方式得到的MemoryInfo所描述的内存使用情况比较详细.数据的单位是KB.
MemoryInfo的Field如下
dalvikPrivateDirty: The private dirty pages used by dalvik。
dalvikPss :The proporKBtional 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.
Android和Linux一样有大量内存在进程之间进程共享。某个进程准确的使用好多内存实际上是很难统计的。
因为有paging out to disk(换页),所以如果你把所有映射到进程的内存相加,它可能大于你的内存的实际物理大小。
关于上诉部分的具体含义也不是十分清楚,目前找到的网上的解释是这样的,如果后续遇到问题,可以继续补充细化
dalvik:是指dalvik所使用的内存。
native:是被native堆使用的内存。应该指使用C\C++在堆上分配的内存。
other:是指除dalvik和native使用的内存。但是具体是指什么呢?至少包括在C\C++分配的非堆内存,比如分配在栈上的内存。
private:是指私有的。非共享的。
share:是指共享的内存。
PSS:实际使用的物理内存(比例分配共享库占用的内存)
Pss:它是把共享内存根据一定比例分摊到共享它的各个进程来计算所得到进程使用内存。网上又说是比例分配共享库占用的内存,那么至于这里的共享是否只是库的共享,还是不清楚。
PrivateDirty:它是指非共享的,又不能换页出去(can not be paged to disk )的内存的大小。比如Linux为了提高分配内存速度而缓冲的小对象,即使你的进程结束,该内存也不会释放掉,它只是又重新回到缓冲中而已。
SharedDirty:参照PrivateDirty我认为它应该是指共享的,又不能换页出去(can not be paged to disk )的内存的大小。比如Linux为了提高分配内存速度而缓冲的小对象,即使所有共享它的进程结束,该内存也不会释放掉,它只是又重新回到缓冲中而已。
如此看来,adb shell dumpsys 应该就是通过 Debug.MemoryInfo获取进程详细内存信息的。