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

时间: 2024-10-14 00:39:14

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

【小功能2】android获取手机信息(号码,内存,CPU,分辨率,MAC,IP,SD卡,IMEI,经纬度,信号强度等等)

为了实现一个功能,需要搜集手机信息,自己先在网上找了相关信息进行了汇总,主要是汇集手机的信息,一般想要的信息在手机设置->关于手机->状态消息里面包含了手机的各种信息,下面的代码中也主要显示了那些信息,但是源码的方法我还没有看,先把总结的贴出来.先上图(太多就截取几个).  上代码啦,太多了,就写主要代码了. // 获取Android手机中SD卡存储信息 获取剩余空间 public void getSDCardInfo() { // 在manifest.xml文件中要添加 /* * <u

android获取手机信息

android系统的很多信息可以通过 /proc 目录下获得,如 cat  /proc/cpuinfo                       获取cpu信息 cat /proc/meminfo                      获取内存信息 这些信息以文本格式保存,可以通过IO流读取,比较简单,在这里考虑到一些内容并不是以文本方式保存,磁盘信息 我们通过代码实现一个linux指令解析器来得到要获取的信息 指令解析器如下: public class CMDExecutor { /**

72获取内存信息(运行的进程数,可用的总内存,剩余内存)&amp;&amp;获取可用的总内存的BUG的解决

获取内存信息(运行的进程数,可用的总内存,剩余内存)属于系统的工具方法了,开始的工具方法是这样的: package com.ustc.mobilemanager.utils; import java.util.List; import android.app.ActivityManager; import android.app.ActivityManager.MemoryInfo; import android.app.ActivityManager.RunningAppProcessInfo

Android获取Exif信息

获取Exif信息 代表的是文件的头信息; 步骤: 步骤一: // 获取指定的文件的头信息对象 ExifInterface exif = new ExifInterface("/sdcard/x.jpg"); 步骤二: 获取指定的头信息: // 获取指定的信息 // 获取拍摄时间 String time =exif.getAttribute(ExifInterface.TAG_DATETIME); System.out.println("拍摄时间是:===" + ti

借助Sigar API获取内存信息

Sigar(全称System Information Gatherer And Reporter,即系统信息收集报表器),它提供了一个开源的跨平台的收集计算机硬件和操作系统信息的API(该API底层接口用C语言编写),本文将演示如何借助Sigar API获取内存信息: package com.ghj.packageoftest; import org.hyperic.sigar.Mem; import org.hyperic.sigar.Sigar; import org.hyperic.sig

android获取设备信息

public class DeviceInfo { private static Application APP = null; private static String sd_card = Environment.getExternalStorageDirectory()+File.separator+"wlcache"; public static Application getApp() { return APP; } // 获取手机型号 public static Strin

Android 获取设备信息 异常

/**获取设备信息 * @param c * @return */ public static void setDeviceInfo(Context c,RequestParams params){ TelephonyManager tm = (TelephonyManager) c.getSystemService(Context.TELEPHONY_SERVICE); if(tm!=null){ try{ params.add("deviceId", tm.getDeviceId(

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

前言:花了一个早上研究了以下android获取经纬度,然后网上的参考资料都是杂七杂八,基本上都是过去几年的,现在我用 android6.0参照别人的结果发生好多错误,我的内心几乎是崩溃的.后来,不断百度,不断goole,不断查找资料,终于解决了,而且完美打包,以后直接用就可以了. 1.这个类原来是用kotlin写的,后来有些东西和java又不同,索性就改成java吧,反正他们兼容性很强-----封装的类名为:LocationUtil package com.example.jason_jan.g

PHP检测获取内存信息

PHP也可以检测获取到Windows的内存信息,而且代码还挺简单,无意发现的,觉得以后能用上,在此与大家分享. 本代码将得到总内存.初始使用等内存信息: <?php echo "初始: ".memory_get_usage()." 字节 \n"; for ($i = 0; $i < 100000; $i++) { $array []= md5($i); } for ($i = 0; $i < 100000; $i++) { unset($array