Emmagee(三)-获取内存信息

来源:互联网 发布:carven淘宝旗舰店 编辑:程序博客网 时间:2024/05/21 09:59

介绍


内存是手机中最纠结的内容,特别是android手机,图片的OOM,甚至衍生到初始化界面都会Crash,内存成为开发最头痛的问题了,最简单的莫过于内存泄露了。Emmagee 虽然说不能够真正的监控到应用程序的内存泄露的问题。但是它已经将一些我们需要的基础的东西监控到了,不过真正用来监控应用工具还是使用android studio ,不过这些都是后话。

总内存


Emmagee获取内存的方式是读取 proc目录下的meminfo文件,我们看看meminfo内容:

1|root@android:/proc # cat meminfo
MemTotal: 364608 kB
MemFree: 31164 kB
Buffers: 15340 kB
Cached: 79620 kB
SwapCached: 0 kB
Active: 126356 kB
Inactive: 140748 kB
Active(anon): 83620 kB
Inactive(anon): 92060 kB
Active(file): 42736 kB
Inactive(file): 48688 kB
Unevictable: 352 kB
Mlocked: 0 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 8 kB

代码如下:

public long getTotalMemory() {    String memInfoPath = "/proc/meminfo";    String readTemp = "";    String memTotal = "";    long memory = 0;    try {        FileReader fr = new FileReader(memInfoPath);        BufferedReader localBufferedReader = new BufferedReader(fr, 8192);        while ((readTemp = localBufferedReader.readLine()) != null) {            if (readTemp.contains("MemTotal")) {                String[] total = readTemp.split(":");                memTotal = total[1].trim();            }        }        localBufferedReader.close();        String[] memKb = memTotal.split(" ");        memTotal = memKb[0].trim();        Log.d(LOG_TAG, "memTotal: " + memTotal);        memory = Long.parseLong(memTotal);    } catch (IOException e) {        Log.e(LOG_TAG, "IOException: " + e.getMessage());    }    return memory;}

以上的代码实际上很简单的,通过字符串的分割查找到MemTotol的值而已。

剩余内存


ActivityManager.getMemoryInfo()主要是用于得到当前系统剩余内存的及判断是否处于低内存运行。

public long getFreeMemorySize(Context context) {    ActivityManager.MemoryInfo outInfo = new ActivityManager.MemoryInfo();    ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);    am.getMemoryInfo(outInfo);    long avaliMem = outInfo.availMem;    return avaliMem / 1024;}

当前应用使用内存


当前应用使用的内存才是我们主要关注的值。获取当前进程内存的方式也同样是通过am的方式进行获取的。

public int getPidMemorySize(int pid, Context context) {    ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);    int[] myMempid = new int[] { pid };    Debug.MemoryInfo[] memoryInfo = am.getProcessMemoryInfo(myMempid);    memoryInfo[0].getTotalSharedDirty();    int memSize = memoryInfo[0].getTotalPss();    return memSize;}

getProcessMemoryInfo:

获取每个进程ID(集合)占用的内存大小(集合), pid和MemoryInfo是一一对应的。

0 0
原创粉丝点击