Android 擷取記憶體資訊

來源:互聯網
上載者:User

標籤:

由於工作需要,研究了一下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 failedlong 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 failedlong 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

Android 擷取記憶體資訊

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.