由于工作需要,研究了一下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. css设置让a标签充满整个li

    首先贴一段html代码: <li id="sendText"><a href="#" title="发送文字">&l ...

  2. 中南大学oj:1352: New Sorting Algorithm

    http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1352 题意:就是要将7 1 5 2这样的序列变成1  2  5  7最少需要多少步?给出变的规律, ...

  3. ftp 自动上传数据库备份文件

    将备份好的数据库文件传到另一个电脑上,自动上传数据库备份文件 #!/bin/bash # ####################################################### ...

  4. 认知计算 Cognitive Computing

    认知计算代表一种全新的计算模式,它包含信息分析,自然语言处理和机器学习领域的大量创新技术. Cognnitive computing refers to systems that learn at s ...

  5. Spring WebSocket教程(一)

    学习背景 很久以前就知道WebSocket,但那时不论是浏览器还是开发技术对它的支持都还很少.但是,Spring4突然发布,让我眼前一亮,Spring4直接支持WebSocket. 对于Spring我 ...

  6. Ubuntu16.04怎么将桌面左侧的启动器移动到屏幕底部

    与其他 Linux 发行版不同,Ubuntu 多年来一直使用 Unity 做桌面环境,该环境的最突出特点就是桌面左侧有一个启动器栏(Launcher).从 16.04 版本开始,Ubuntu 提供了一 ...

  7. 扫描二维码或其他操作情况下返回界面,onActivityResult()不执行的问题

    在使用第三方zxing扫描时,部分手机(好像都是4.4及以下版本的手机)扫描后不调用onActivityResult()返回结果. 调试发现zxing的扫描界面CaptureActivity 在注册时 ...

  8. 关于Unity中水和雾的使用

    水 自己来做水和雾还是有点麻烦的,不过没关系,Unity帮我们做好了很多可以用的. 1.Unity自己实现了水的特效,帮助我们解决游戏中水的问题 2.Unity的水集成在了Environment的环境 ...

  9. 【CUDA学习】结构体指针复制

    内核函数中要用data结构作用参数 typedef struct { int* value; int* num; } data; //host端 data* h_input; h_input=(dat ...

  10. C艹函数与结构体

    传递指针 代码: #include <iostream> #include <cmath> struct polar{ double distance; double angl ...