Android 獲取內存信息


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM