【问题标题】:RAM usage in Android L vs KitkatAndroid L 与 Kitkat 中的 RAM 使用情况
【发布时间】:2015-02-21 10:16:25
【问题描述】:

这是我在分析 android jar 在棒棒糖中的兼容性时发现的一个奇怪问题。我是 android 新手。我写了一个简单的应用程序,它有一个屏幕和一个按钮,按下按钮时,它会调用jar 中的方法来执行一些服务器调用。我使用 adb 命令来分析应用程序的内存占用,

adb shell dumpsys meminfo <package_name>

这是 kitkat 中的足迹,(我没有添加其余行,因为我们只关心足迹中 dalvik heap 的私有脏列,因为那是专门为应用程序分配的 RAM包括我们自己的分配。)

** MEMINFO in pid 876 [XXXXX] **

                   Pss  Private  Private  Swapped     Heap     Heap     Heap
                 Total    Dirty    Clean    Dirty     Size    Alloc     Free
                ------   ------   ------   ------   ------   ------   ------
  Native Heap     3054     3032        0        0     6208     5733      178
  Dalvik Heap     4338     4012        0        0    12756    11514     1242

这是棒棒糖中的足迹,

** MEMINFO in pid 201 [XXXX] **

                   Pss  Private  Private  Swapped     Heap     Heap     Heap
                 Total    Dirty    Clean    Dirty     Size    Alloc     Free
                ------   ------   ------   ------   ------   ------   ------
  Native Heap     3412     3360        0        0     5572     5236      335
  Dalvik Heap    10359    10132        0        0    18762    11338     7424

如果您比较两者中私有脏列中的 dalvik 堆,kitkat 使用大约 4MB 的 RAM,而 lollipop 使用大约 10MB 的 RAM。它是在两个操作系统中执行的同一个应用程序,差异很大。

基于此的几个问题,

  1. 你们中有人看到棒棒糖中这种增加的内存消耗吗?。
  2. 知道为什么棒棒糖的 RAM 使用率更高吗?
  3. 是否有工具可以可视化应用的 RAM 分配?

PS:我在棒棒糖中获取了应用程序的堆转储,我可以看到 android.res.Resources 系统类对象使用了 4.4 MB 内存。我不知道这些资源对象可能是什么,因为应用程序和 jar 都没有静态资源。

【问题讨论】:

    标签: android performance android-5.0-lollipop android-4.4-kitkat dalvik


    【解决方案1】:

    Android Lollipop 内置了 ART(Android Runtime) 虚拟机,而不是 Kitkat 的 Dalvik vm。 ART 将应用程序的字节码转换为本机指令,然后由设备的运行时环境执行。ART 工作于提前编译 (AOT) 的概念,并在应用程序安装期间保存已编译的类,而 Dalvik 的工作原理是 Just及时 (JIT) 编译并在应用程序存在时清除已编译类的缓存,并在启动应用程序的新实例时重新编译每个类。

    知道为什么棒棒糖的 RAM 使用率更高吗?

    保持与现有应用的向后兼容性。 ART 使用与 Dalvik 相同的输入字节码,通过标准 .dex 文件作为 APK 文件的一部分提供,而 .odex 文件被替换为可执行和可链接格式 (ELF) 可执行文件。使用 ART 的设备上 dex2oat 实用程序编译应用程序后,它仅从已编译的 ELF 可执行文件中运行;这种方法消除了 JIT 编译所涉及的各种开销,但是在安装应用程序时需要额外的编译时间,并且应用程序会占用稍多的空间来存储已编译的代码。

    是否有可视化应用程序 RAM 分配的工具?

    cat /proc/meminfo-这将给出一些内存统计信息。如果您添加“memfree + cached”,您将获得全部可用的可用内存。 dumpsys meminfo - 这将为所有当前进程提供内存信息 dumpsys meminfo - 为特定进程转储。

    除此之外,您还可以使用 Eclipse MAT 插件来分析 JVM 堆内容。

    【讨论】:

    • Dalvik private dirty 不显示本机代码内存使用情况对吗?它只显示应用程序分配。
    • 查看下面的超链接。
    • dex2oat 会增加代码大小,我理解。但这如何转化为私人肮脏的增加?
    【解决方案2】:

    内存要么是私有的,这意味着它是这个进程独有的,要么是共享的,这意味着多个进程可以映射和使用它(想想共享库代码等)。内存也可以是干净的——它没有被修改,因为它是从磁盘加载或作为零填充页面提供的,所以如果需要释放它来为其他进程提供内存页面,它可以被丢弃,并在再次需要或脏时重新加载/重新填充,这意味着如果需要释放它,则必须将其写出到交换区域,以便在必要时可以恢复修改的内容。

    检查此link。它将为您提供 zygote 内存分配的概述。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-23
      • 1970-01-01
      相关资源
      最近更新 更多