为了账号安全,请及时绑定邮箱和手机立即绑定

如何在Android中获取当前内存使用量?

如何在Android中获取当前内存使用量?

白衣非少年 2019-07-22 16:13:48
如何在Android中获取当前内存使用量?我使用了/proc/meminfo并解析了命令响应,但是结果显示:内存总数:94348 kB内存空闲:5784 kB手段。它显示只有5MB的空闲内存。Android手机有可能吗?我的手机上只安装了5-6个应用程序,没有其他任务正在运行。但是,这个命令仍然显示出内存非常少。有人能澄清这一点吗?或者,在Android中还有其他方法来获得内存的使用吗?
查看完整描述

3 回答

?
慕婉清6462132

TA贡献1804条经验 获得超2个赞

注意:这个答案测量设备的内存使用/可用。这不是你的应用程序可以使用的东西。为了衡量你的应用程序正在做什么,并被允许做什么,使用Android开发者的答案.


Android文档-ActivityManager.MemoryInfo

  1. 解析/proc/meminfo命令。您可以在这里找到参考代码:在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 Mebibyte1024 * 1024     == 10485761048576         == 0x100000

很明显,这个数字被用来从字节转换为mebi字节

我们只需要计算一次总内存。因此,只在代码中调用1点,然后再重复调用第2点的代码。


查看完整回答
反对 回复 2019-07-22
?
MMMHUHU

TA贡献1834条经验 获得超8个赞

这取决于您要获得的内存查询的定义。


通常,您想知道堆内存的状态,因为如果它占用了太多内存,您就会得到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”变量越接近“maxHeapSizeInMB”,就越接近availHeapSizeInMB到零,你得到的OOM越近。(由于内存碎片,您可能在达到零之前获得OOM。)

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


或者,有真正的RAM使用,这就是整个系统使用了多少-请参阅接受答案计算一下。


更新:由于AndroidO使您的应用程序也使用本机RAM(至少对于位图存储,这通常是占用大量内存的主要原因),而不仅仅是堆,所以情况发生了变化,您得到的OOM更少(因为堆不再包含位图,请检查)。这里),但是如果你怀疑你有内存泄漏,你仍然应该注意内存的使用。在AndroidO上,如果内存泄漏本应导致旧版本的OOM,那么它似乎就会崩溃,而无法捕捉到它。下面是如何检查内存使用情况:

 val nativeHeapSize = Debug.getNativeHeapSize()
 val nativeHeapFreeSize = Debug.getNativeHeapFreeSize()
 val usedMemInBytes = nativeHeapSize - nativeHeapFreeSize
 val usedMemInPercentage = usedMemInBytes * 100 / nativeHeapSize

但我认为最好使用IDE的分析器,它使用图表实时显示数据。

因此,Android O的好消息是,由于OOM存储了太多大位图,所以很难得到崩溃,但坏消息是,我认为在运行时不可能捕捉到这样的情况。


查看完整回答
反对 回复 2019-07-22
?
牛魔王的故事

TA贡献1830条经验 获得超3个赞

下面是计算内存使用情况的一种方法当前正在运行的应用程序:

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;}


查看完整回答
反对 回复 2019-07-22
  • 3 回答
  • 0 关注
  • 1368 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信