由於工作需要,研究了一下android上獲取內存信息的方法,總結如下:
1.SDK獲取
在Java層利用API獲取很簡單,直接使用ActivityManager.MemoryInfo類即可,代碼如下:
ActivityManager activityManager=(ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); ActivityManager.MemoryInfo memInfo=new ActivityManager.MemoryInfo(); activityManager.getMemoryInfo(memInfo); Log.v("memInfo", "availMem:"+memInfo.availMem/1024+" kb"); Log.v("memInfo", "threshold:"+memInfo.threshold/1024+" kb");//low memory threshold Log.v("memInfo", "totalMem:"+memInfo.totalMem/1024+" kb"); Log.v("memInfo", "lowMemory:"+memInfo.lowMemory); //if current is in low memory
2.NDK獲取
在native層獲取內存信息Java層比較不同,android沒有提供相應的API(我沒有找到,如果有高手找到了,歡迎留言)。考慮到android系統是基於linux系統修改的,因此有一個/proc/meminfo文件用於存儲當前的內存信息。這個文件里存儲的內容很多,在PC上執行adb shell命令后,輸入cat /proc/meminfo,會顯示如下信息:
一般我們只對可用內存和總內存感興趣,參考網上的代碼自己封裝了兩個函數如下,如果要獲取其他信息,以此類推即可,代碼如下:
//get the available memory in kb, return -1 if get failed long getAvailMem() { signed long availMem=-1; int memInfoFile = open("/proc/meminfo", O_RDONLY); if (memInfoFile < 0) {return availMem;} char buffer[256]; const int len = read(memInfoFile, buffer, sizeof(buffer)-1); close(memInfoFile); if (len < 0) {return availMem;} buffer[len] = 0; int numFound = 0; static const char* const sums[] = { "MemFree:", "Cached:", NULL }; static const int sumsLen[] = { strlen("MemFree:"), strlen("Cached:"), 0 }; char* p = buffer; while (*p && numFound < 2) { int i = 0; while (sums[i]) { if (strncmp(p, sums[i], sumsLen[i]) == 0) { p += sumsLen[i]; while (*p == ' ') p++; char* num = p; while (*p >= '0' && *p <= '9') p++; if (*p != 0) { *p = 0; p++; if (*p == 0) p--; } availMem += atoll(num); numFound++; break; } i++; } p++; } return availMem; } //get the total memory in kb, return -1 if get failed long getTotalMem() { signed long totalMem=-1; int memInfoFile = open("/proc/meminfo", O_RDONLY); if (memInfoFile < 0) {return totalMem;} char buffer[256]; const int len = read(memInfoFile, buffer, sizeof(buffer)-1); close(memInfoFile); if (len < 0) {return totalMem;} buffer[len] = 0; static const char* const sums[] = { "MemTotal:", NULL }; static const int sumsLen[] = { strlen("MemTotal:"), 0 }; char* p = buffer; while (*p ) { int i = 0; while (sums[i]) { if (strncmp(p, sums[i], sumsLen[i]) == 0) { p += sumsLen[i]; while (*p == ' ') p++; char* num = p; while (*p >= '0' && *p <= '9') p++; if (*p != 0) { *p = 0; p++; if (*p == 0) p--; } totalMem += atoll(num); break; } i++; } p++; } return totalMem; }
解釋一下可用內存availMem為什么是MemFree和Cached的總和,MemFree指的是完全未被使用的內存,Cached指的是,當你讀寫文件的時候,Linux內核為了提高讀寫性能與速度,會將文件在內存中進行緩存,也就是Cache Memory(緩存內存)。即使你的程序運行結束后,Cache Memory也不會自動釋放。這就會導致你在Linux系統中程序頻繁讀寫文件后,你會發現可用物理內存會很少。其實這緩存內存(Cache Memory)在你需要使用內存的時候會自動釋放,所以你不必擔心沒有內存可用。因此可用內存availMem=MemFree+Cached
3.參考資料
http://blog.chinaunix.net/uid-9465077-id-270364.html
http://www.xuebuyuan.com/1878297.html
http://www.ha97.com/4337.html
http://developer.android.com/intl/zh-cn/reference/android/app/ActivityManager.MemoryInfo.html