Android系列之获取设备内存数据信息

App分配内存

        首先,我们通过Android系统提供的方法获取 分配给App本身的运行数据信息,这里我们能获取系统分配给App的最大内存信息(这个数据根据不同的机型可能会不一样),当前已分配内存大小,以及当前分配剩余内存大小等内存数据信息。

ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
ActivityManager.MemoryInfo mi = new ActivityManager.MemoryInfo();
//设备内存
manager.getMemoryInfo(mi);
String totalMem = Formatter.formatFileSize(context, mi.totalMem);
System.out.println("设备的运行总内存 totalMem: " + totalMem);
String availMem = Formatter.formatFileSize(context, mi.availMem);
System.out.println("设备剩余运行内存 availMem: " + availMem);
//最大分配内存获取方法1
int memory = manager.getMemoryClass();
System.out.println("app可分配最大内存memory: " + memory);
//最大分配内存获取方法2
float maxMemory = (float) (Runtime.getRuntime().maxMemory() * 1.0 / (1024 * 1024));
System.out.println("app可分配最大内存 maxMemory: " + maxMemory);
//当前分配的总内存
float totalMemory = (float) (Runtime.getRuntime().totalMemory() * 1.0 / (1024 * 1024));
System.out.println("app当前分配内存totalMemory: " + totalMemory);
//当前分配使用剩余内存
float freeMemory = (float) (Runtime.getRuntime().freeMemory() * 1.0 / (1024 * 1024));
System.out.println("app当前分配剩余内存freeMemory: " + reeMemory);

设备运行内存

        我们通过Android系统提供的方法获取设备的总运行内存数据信息,但是我们获取的可用内存信息可能不是很准确,可能会包含一些实际在运行的App所占内存信息。

manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
ActivityManager.MemoryInfo mi = new ActivityManager.MemoryInfo();
manager.getMemoryInfo(mi);
// double totalMem = (double) (mi.totalMem * 1.0 / (1024 * 1024));
String totalMem = Formatter.formatFileSize(context, mi.totalMem);
System.out.println(("设备的运行总内存: " + totalMem + " M"));
// double availMem= (double) (mi.availMem* 1.0 / (1024 * 1024));
String availMem = Formatter.formatFileSize(context, mi.availMem);
System.out.println(("设备剩余运行内存: " + availMem));

        当然也有其他的方法获取内存信息,比如直接读取系统的内存信息保存文件 /proc/meminfo

        直接读取此文件信息的方法如下

public static List<String> getMemInfo() {
    List<String> result = new ArrayList<>();
    try {
        String line;
        FileReader reader = new FileReader("/proc/meminfo");
        BufferedReader br = new BufferedReader(reader);
        while ((line = br.readLine()) != null) {
            result.add(line);
        }
        reader.close();
        br.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return result;
}

/* /proc/meminfo
    MemTotal:        2902436 kB
    MemFree:          199240 kB
    MemAvailable:    1088764 kB
    Buffers:           40848 kB
    Cached:           862908 kB
    SwapCached:        54696 kB
    Active:          1222848 kB
    Inactive:         671468 kB
    Active(anon):     758516 kB
    Inactive(anon):   242560 kB
    Active(file):     464332 kB
    Inactive(file):   428908 kB
    Unevictable:        5972 kB
    Mlocked:             256 kB
    SwapTotal:       1048572 kB
    SwapFree:         537124 kB
    Dirty:                12 kB
    Writeback:             0 kB
    AnonPages:        988820 kB
    Mapped:           508996 kB
    Shmem:              4800 kB
    Slab:             157204 kB
    SReclaimable:      57364 kB
    SUnreclaim:        99840 kB
    KernelStack:       41376 kB
    PageTables:        51820 kB
    NFS_Unstable:          0 kB
    Bounce:                0 kB
    WritebackTmp:          0 kB
    CommitLimit:     2499788 kB
    Committed_AS:   76292324 kB
    VmallocTotal:   258867136 kB
    VmallocUsed:           0 kB
    VmallocChunk:          0 kB
    CmaTotal:              0 kB
    CmaFree:               0 kB
*/

获取指定的内存信息情况的方法
public static String getFieldFromMeminfo(String field) throws IOException {
    BufferedReader br = new BufferedReader(new FileReader("/proc/meminfo"));
    Pattern p = Pattern.compile(field + "\\s*:\\s*(.*)");
    try {
        String line;
        while ((line = br.readLine()) != null) {
            Matcher m = p.matcher(line);
            if (m.matches()) {
                return m.group(1);
            }
        }
    } finally {
        br.close();
    }
    return null;
}

public static String getMemTotal() {
    String result = null;
    try {
        result = getFieldFromMeminfo("MemTotal");
    } catch (IOException e) {
        e.printStackTrace();
    }
    return result;
}

public static String getMemFree() {
    String result = null;
    try {
        result = getFieldFromMeminfo("MemFree");
    } catch (IOException e) {
        e.printStackTrace();
    }
    return result;
}


public static String getMemAvailable() {
    String result = null;
    try {
        result = getFieldFromMeminfo("MemAvailable");
    } catch (IOException e) {
        e.printStackTrace();
    }
    return result;
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值