由于工作需要,研究了一下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. 青铜到王者,快速提升你 MySQL 数据库的段位!

    Reference: https://mp.weixin.qq.com/s?src=11&timestamp=1513259125&ver=574&signature=Uxls ...

  2. NLP实现文本分词+在线词云实现工具

    实现文本分词+在线词云实现工具 词云是NLP中比较简单而且效果较好的一种表达方式,说到可视化,R语言当仍不让,可见R语言︱文本挖掘——词云wordcloud2包 当然用代码写词云还是比较费劲的,网上也 ...

  3. [转]java中通过request获取路径中的不同信息

    原文地址:http://blog.csdn.net/lv_shijun/article/details/40819859 aa为工程中的项目名 bb为webRoot下的文件夹 1.request.ge ...

  4. Unity3D-RPG项目实战(4):角色性能測试

    前言 用一个新的引擎.还是要沉下心来学习.记得2007年用Unreal Engine 3做项目的时候.就有过慘痛的教训:前面话了个把月的时间学习Unreal.认为摸门了.于是就着急忙慌的进入项目正式开 ...

  5. C#中的Partial

    Partial关键词定义的类可以在多个地方被定义,最后编译的时候会被当作一个类来处理. 首先看一段在C#中经常出现的代码,界面和后台分离,但是类名相同. public partial class Fo ...

  6. centos下软件安装

    1. vim安装 yum -y install vim*

  7. js 窗口抖动

    <title>窗口抖动</title> <style> body{margin:50px; } #qq{position:relative;} span{paddi ...

  8. 云服务器启动tomcat巨慢,很慢

    增加随机数生成熵池 0.查看熵池 cat /proc/sys/kernel/random/entropy_avail 1. yum install rng-tools 2. systemctl sta ...

  9. CREATESTRUCT cs 结构体

    PreCreateWindow(CREATESTRUCT& cs) typedef struct tagCREATESTRUCT { LPVOID lpCreateParams; // 创建窗 ...

  10. [Forward]Ten Caching Mistakes that Break your App

    Caching large objects, duplicate objects, caching collections, live objects, thread unsafe caching a ...