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

Android 获取内存信息的更多相关文章

  1. I.MX6 android 获取framebuffer信息

    /******************************************************************************** * I.MX6 android 获取 ...

  2. Android 获取手机信息,设置权限,申请权限,查询联系人,获取手机定位信息

    Android 获取手机信息,设置权限,申请权限,查询联系人,获取手机定位信息 本文目录: 获取手机信息 设置权限 申请权限 查询联系人 获取手机定位信息 调用高德地图,设置显示2个坐标点的位置,以及 ...

  3. linux通过脚本获取内存信息

    1 原理 脚本中通过执行free获取内存信息,然后将文本信息通过“空格”分隔符分割成字符串数组将不同信息提取出来,最后通过bc计算出百分比 2 脚本 #!/bin/shHOSTNAME=`hostna ...

  4. Android获取位置信息的方法总结

    1.位置服务的简介:位置服务,英文翻译为Location-Based Services,缩写为LBS,又称为定位服务或基于位置的服务,融合了GPS定位.移动通信.导航等多种技术,提供与空间位置相关的综 ...

  5. Android 获取设备信息 异常

    /**获取设备信息 * @param c * @return */ public static void setDeviceInfo(Context c,RequestParams params){ ...

  6. PHP检测获取内存信息

    PHP也可以检测获取到Windows的内存信息,而且代码还挺简单,无意发现的,觉得以后能用上,在此与大家分享. 本代码将得到总内存.初始使用等内存信息: <?php echo "初始: ...

  7. Android 获取地理位置信息 封装好了 直接用

    前言:花了一个早上研究了以下android获取经纬度,然后网上的参考资料都是杂七杂八,基本上都是过去几年的,现在我用 android6.0参照别人的结果发生好多错误,我的内心几乎是崩溃的.后来,不断百 ...

  8. android 获取手机信息工具类

    package com.yqy.yqy_listviewheadview; import android.content.Context; import android.telephony.Telep ...

  9. android 获取IMSI信息(判断是移动,联通,电信手机卡)

    首先我们需要知道手机IMSI号前面3位460是国家,紧接着后面2位00 02是中国移动,01是中国联通,03是中国电信.那么第一步就是先获取手机IMSI号码:代码如下 /** *获取IMSI信息 * ...

随机推荐

  1. 详解利用Dockerfile构建mysql镜像并实现数据的初始化及权限设置

    本文提要 本文目的不仅仅是创建一个MySQL的镜像,而是在其基础上再实现启动过程中自动导入数据及数据库用户的权限设置,并且在新创建出来的容器里自动启动MySQL服务接受外部连接,主要是通过Docker ...

  2. Codeforces Round #215 (Div. 2) D. Sereja ans Anagrams

    http://codeforces.com/contest/368/problem/D 题意:有a.b两个数组,a数组有n个数,b数组有m个数,现在给出一个p,要你找出所有的位置q,使得位置q  q+ ...

  3. 关于centos安装后一些命令找不到

    刚才遇到那么尴尬的一个情况,输入啥命令都没找到.连ifconfig都不放过. 后分析极可能是以下两种缘故: 1.缺少安装包 [root@Tzhost-170802-FCF0 /]# yum searc ...

  4. python 数据工程 and 开发工具Sublime

    数据工程采集.存储.清洗.分析.可视化 编程语言C++和Javapython大法Rweb:php.html.css.javascript 结合采集:python存储:python+数据库/.csv/t ...

  5. java基础篇---注解(Annotation)

    一.概念 Annontation是Java5开始引入的新特征.中文名称一般叫注解.它提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata)与程序元素(类.方法.成员变量等)进行关 ...

  6. Wince/VC高效PNG贴图,自定义Alpha算法

    工作中,做一些炫点的界面都需要用到PNG图片,Wince里面微软也提供了PNG图片的支持,不过Alpha的混合速度比较慢,所以自己实现了一个Alpha的混合运算接口,经过测试,要比微软AlphaBle ...

  7. [转]PowerDesigner表结构和字段大小写转换

    原文地址:https://blog.csdn.net/u010216641/article/details/48712503 ##PowerDesigner去除双引号## 平时经常用PowerDesi ...

  8. docker打开api remote接口设置

    前言  本文记录docker怎么打开api remote接口设置,docker的版本更新太快了,不同的版本之间,设置可能不同,本文是针对docker13.1 1. 查看配置文件位于哪里 systemc ...

  9. Android Things专题5 I2C

    文| 谷歌开发人员技术专家, 物联网方向 (IOT GDE) 王玉成(York Wang) 上一讲中.我们说到 Android Things 的 API,以及 Peripheral I/O 设备包括的 ...

  10. 【emWin】例程三十三:窗口对象———Radio

    简介: 如同复选框一样,单选按钮也可用来选择选项.打开或选择单选按钮时,将出现 圆点.与复选框的差别是,用户一次只能选择一个单选按钮.选择一个按钮时,小工 具中的其他按钮将关闭. 触摸校准(上电可选择 ...