如何获得当前在android的内存使用情况?

我已经使用/ proc / meminfo和parsing的命令response.however它的结果表明:

MemTotal:94348 kB MemFree:5784 kB

手段。 它显示只有5MB可用内存。 这是可能与Android手机? 我的手机上只安装了5-6个应用程序,没有其他任务正在运行。 但是这个命令仍然显示有很less的空闲内存。

有人可以澄清这一点吗? 或者是有任何其他方式获取内存使用情况在Android?

小心:此答案测量DEVICE的存储器使用情况/可用情况。 这不是什么可用于您的应用程序。 要衡量你的APP正在做什么,并且被允许做, 请使用android开发者的答案 。


Android文档 – ActivityManager.MemoryInfo

  1. parsing/ proc / meminfo命令。 你可以在这里find参考代码: 在Android中获取内存使用

  2. 使用下面的代码并获得当前的RAM:

     MemoryInfo mi = new MemoryInfo(); ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE); activityManager.getMemoryInfo(mi); double availableMegs = mi.availMem / 0x100000L; //Percentage can be calculated for API 16+ double percentAvail = mi.availMem / (double)mi.totalMem * 100.0; 

数字0x100000L的解释

 1024 bytes == 1 Kibibyte 1024 Kibibyte == 1 Mebibyte 1024 * 1024 == 1048576 1048576 == 0x100000 

这是很明显的数字是用来从字节转换为兆字节

PS:我们只需要计算一次总内存。 所以在你的代码中只有一次调用点1,然后可以重复调用点2的代码。

这取决于你想要得到什么内存查询的定义。


通常,你想知道堆内存的状态,因为如果它使用太多的内存,你会得到OOM和崩溃的应用程序。

为此,您可以检查下一个值:

 final Runtime runtime = Runtime.getRuntime(); final long usedMemInMB=(runtime.totalMemory() - runtime.freeMemory()) / 1048576L; final long maxHeapSizeInMB=runtime.maxMemory() / 1048576L; final long availHeapSizeInMB = maxHeapSizeInMB - usedMemInMB; 

“usedMemInMB”variables越接近“maxHeapSizeInMB”, availHeapSizeInMB越接近零,越接近OOM。 (由于内存碎片,您可能会在达到0之前得到OOM。)

这也是内存使用的DDMS工具显示的内容。


另外,还有真正的RAM使用情况,即整个系统使用量 – 请参阅接受的答案来计算。

这是一种计算当前运行的应用程序的内存使用情况的方法

 public static long getUsedMemorySize() { long freeSize = 0L; long totalSize = 0L; long usedSize = -1L; try { Runtime info = Runtime.getRuntime(); freeSize = info.freeMemory(); totalSize = info.totalMemory(); usedSize = totalSize - freeSize; } catch (Exception e) { e.printStackTrace(); } return usedSize; } 

另一种方式(目前在我的G1上显示25MB免费):

 MemoryInfo mi = new MemoryInfo(); ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE); activityManager.getMemoryInfo(mi); long availableMegs = mi.availMem / 1048576L; 

Linux的内存pipe理理念是“自由内存浪费内存”。

我假设接下来的两行将显示“缓冲区”中有多less内存以及“caching”有多less。 虽然两者之间有所不同(请不要问这是什么区别:)他们都大致加起来用来caching文件数据和元数据的内存量。

free(1)命令是一个更有用的在Linux系统上释放内存的指南; 在我的桌面上,它会报告这样的信息:

 $ free -m
             caching总共使用的空闲共享缓冲区
 Mem:5980 1055 4924 0 91 374
 -  / + buffers / cache:589 5391
交换:6347 0 6347

+/-缓冲器/caching:线是神奇的线,它报告说,我真的有约589兆主动所需的进程内存,约5391兆的“免费”的内存,在这个意义上说,91 + 374兆字节缓冲区/caching的内存可以扔掉,如果内存可以更有利地使用其他地方。

(我的机器已经运行了三个小时,几乎没有任何东西,只是换了个计算器,这就是为什么我有这么多空闲的内存。)

如果Android不提供free(1) ,你可以用/proc/meminfo文件自己做math; 我只是喜欢free(1)输出格式。 🙂

我提到几个着作。

参考:

此getMemorySize()方法返回具有总计和可用内存大小的MemorySize。
我完全不相信这个代码。
此代码正在testingLG G3 cat.6(v5.0.1)

  private MemorySize getMemorySize() { final Pattern PATTERN = Pattern.compile("([a-zA-Z]+):\\s*(\\d+)"); MemorySize result = new MemorySize(); String line; try { RandomAccessFile reader = new RandomAccessFile("/proc/meminfo", "r"); while ((line = reader.readLine()) != null) { Matcher m = PATTERN.matcher(line); if (m.find()) { String name = m.group(1); String size = m.group(2); if (name.equalsIgnoreCase("MemTotal")) { result.total = Long.parseLong(size); } else if (name.equalsIgnoreCase("MemFree") || name.equalsIgnoreCase("Buffers") || name.equalsIgnoreCase("Cached") || name.equalsIgnoreCase("SwapFree")) { result.free += Long.parseLong(size); } } } reader.close(); result.total *= 1024; result.free *= 1024; } catch (IOException e) { e.printStackTrace(); } return result; } private static class MemorySize { public long total = 0; public long free = 0; } 

我知道Pattern.compile()是昂贵的代价,所以您可以将其代码移动到类成员。

我看着Android的源代码树。

在com.android.server.am里面。 ActivityManagerService.java (由android.app.ActivityManager公开的内部服务)。

 public void getMemoryInfo(ActivityManager.MemoryInfo outInfo) { final long homeAppMem = mProcessList.getMemLevel(ProcessList.HOME_APP_ADJ); final long hiddenAppMem = mProcessList.getMemLevel(ProcessList.HIDDEN_APP_MIN_ADJ); outInfo.availMem = Process.getFreeMemory(); outInfo.totalMem = Process.getTotalMemory(); outInfo.threshold = homeAppMem; outInfo.lowMemory = outInfo.availMem < (homeAppMem + ((hiddenAppMem-homeAppMem)/2)); outInfo.hiddenAppThreshold = hiddenAppMem; outInfo.secondaryServerThreshold = mProcessList.getMemLevel( ProcessList.SERVICE_ADJ); outInfo.visibleAppThreshold = mProcessList.getMemLevel( ProcessList.VISIBLE_APP_ADJ); outInfo.foregroundAppThreshold = mProcessList.getMemLevel( ProcessList.FOREGROUND_APP_ADJ); } 

在android.os里面。 Process.java

 /** @hide */ public static final native long getFreeMemory(); /** @hide */ public static final native long getTotalMemory(); 

它从android_util_Process.cpp调用JNI方法

结论

MemoryInfo.availMem = MemFree +caching在/ proc / meminfo中。

笔记

总内存在API级别16中添加。

你也可以使用它自己的android SDK的一部分的DDMS工具。 它有助于获得java代码和原生c / c ++代码的内存分配。

 public static boolean isAppInLowMemory(Context context) { ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); ActivityManager.MemoryInfo memoryInfo = new ActivityManager.MemoryInfo(); activityManager.getMemoryInfo(memoryInfo); return memoryInfo.lowMemory; }