Android 获取内存信息
由于工作需要,研究了一下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 获取内存信息的更多相关文章
- I.MX6 android 获取framebuffer信息
/******************************************************************************** * I.MX6 android 获取 ...
- Android 获取手机信息,设置权限,申请权限,查询联系人,获取手机定位信息
Android 获取手机信息,设置权限,申请权限,查询联系人,获取手机定位信息 本文目录: 获取手机信息 设置权限 申请权限 查询联系人 获取手机定位信息 调用高德地图,设置显示2个坐标点的位置,以及 ...
- linux通过脚本获取内存信息
1 原理 脚本中通过执行free获取内存信息,然后将文本信息通过“空格”分隔符分割成字符串数组将不同信息提取出来,最后通过bc计算出百分比 2 脚本 #!/bin/shHOSTNAME=`hostna ...
- Android获取位置信息的方法总结
1.位置服务的简介:位置服务,英文翻译为Location-Based Services,缩写为LBS,又称为定位服务或基于位置的服务,融合了GPS定位.移动通信.导航等多种技术,提供与空间位置相关的综 ...
- Android 获取设备信息 异常
/**获取设备信息 * @param c * @return */ public static void setDeviceInfo(Context c,RequestParams params){ ...
- PHP检测获取内存信息
PHP也可以检测获取到Windows的内存信息,而且代码还挺简单,无意发现的,觉得以后能用上,在此与大家分享. 本代码将得到总内存.初始使用等内存信息: <?php echo "初始: ...
- Android 获取地理位置信息 封装好了 直接用
前言:花了一个早上研究了以下android获取经纬度,然后网上的参考资料都是杂七杂八,基本上都是过去几年的,现在我用 android6.0参照别人的结果发生好多错误,我的内心几乎是崩溃的.后来,不断百 ...
- android 获取手机信息工具类
package com.yqy.yqy_listviewheadview; import android.content.Context; import android.telephony.Telep ...
- android 获取IMSI信息(判断是移动,联通,电信手机卡)
首先我们需要知道手机IMSI号前面3位460是国家,紧接着后面2位00 02是中国移动,01是中国联通,03是中国电信.那么第一步就是先获取手机IMSI号码:代码如下 /** *获取IMSI信息 * ...
随机推荐
- 什么是POP3、SMTP和IMAP?
POP3 POP3是Post Office Protocol 3的简称,即邮局协议的第3个版本,它规定怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的电子协议.它是因特网电子邮件的第 ...
- JSP怎么将表单提交到对应的servlet
昨天学习了这些内容,今天做一下分享吧,个人感觉挺乱的....呵呵,其实没事,慢慢就好了.难的不会,会的不难嘛!努力+认真就可以了,相信大家都可以的!加油!!! 下面的图是我用myeclipse建立的项 ...
- php阿里云oss文件上传
php的文件上传 文件上传 php的文件上传放在了$_FILES数组里,单文件和多文件上传的区别在于$_FILES['userfile']['name']是否为数组, 不熟悉的可以读一下官方文档 单文 ...
- python 数据工程 and 开发工具Sublime
数据工程采集.存储.清洗.分析.可视化 编程语言C++和Javapython大法Rweb:php.html.css.javascript 结合采集:python存储:python+数据库/.csv/t ...
- 我的zsh简单设置
bash用久了,有些地方开始觉得不爽,于是想看看有没有更好的选择.原来在网上瞎逛时,已经很多次看到有人推荐zsh了,加上zsh高度兼容bash,于是就来折腾这个. 不过试验了一下oh-my-zsh,感 ...
- 【emWin】例程三十三:窗口对象———Radio
简介: 如同复选框一样,单选按钮也可用来选择选项.打开或选择单选按钮时,将出现 圆点.与复选框的差别是,用户一次只能选择一个单选按钮.选择一个按钮时,小工 具中的其他按钮将关闭. 触摸校准(上电可选择 ...
- C语言 · 栅格打印问题
算法提高 栅格打印问题 时间限制:1.0s 内存限制:512.0MB 问题描述 编写一个程序,输入两个整数,作为栅格的高度和宽度,然后用“+”.“-”和“|”这三个字符来打印一个栅格 ...
- 25个最常用的iptables策略
1.清空存在的策略当你开始创建新的策略,你可能想清除所有的默认策略,和存在的策略,可以这么做:iptables -F 或者iptables --flush2,设置默认策略默认链策略是ACCEPT,改 ...
- 从Java开发者的视角解释JavaScript
我们无法在一篇博文里解释JavaScript的所有细节.如果你正或多或少地涉及了web应用程序开发,那么,我们的Java工具和技术范围报告揭示了,大多数(71%)Java开发者被归到了这一类,只是你对 ...
- js在IE与firefox的差别。。。
1.firefox不能对innerText支持.firefox支持innerHTML但却不支持innerText,它支持textContent来实现innerText,不过默认把多余的空格也保留了.如 ...