Emmagee(三)-获取内存信息

介绍


内存是手机中最纠结的内容,特别是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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值