- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
这是我在分析我们的 android jar 在 lollipop 中的兼容性时发现的一个奇怪的问题。我是 android 的新手。我写了一个简单的应用程序,它有一个屏幕和一个按钮,当按下按钮时,它调用jar 中的方法来执行一些服务器调用。我使用 adb 命令来分析应用程序的内存占用,
adb shell dumpsys meminfo <package_name>
这是 kitkat 中的占用空间,(我没有添加其余行,因为我们只关心占用空间中 dalvik 堆的私有(private)脏列,因为那是专门为应用程序分配的 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
这是 Lollipop 中的足迹,
** 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
如果比较两者私有(private)脏列中的 dalvik 堆,kitkat 使用大约 4MB 的 RAM,而 lollipop 使用大约 10MB 的 RAM。它是在两个操作系统中执行的相同应用程序,并且差异巨大。
基于此的几个问题,
PS: 我在 lollipop 中获取了应用程序的堆转储,我可以看到 android.res.Resources 系统类对象使用了 4.4 MB 的内存。我不知道这些资源对象可能是什么,因为应用程序和 jar 都没有静态资源。
最佳答案
Android Lollipop 在 Kitkat 的情况下内置了 ART(Android 运行时)虚拟机而不是 Dalvik 虚拟机。 ART 将应用程序的字节码转换为稍后由设备的运行时环境执行的 native 指令。ART 的工作原理是提前编译 (AOT) 并在应用程序安装期间保存编译的类,而 Dalvik 的工作原理是 Just及时 (JIT) 编译并在应用程序存在后清除已编译类的缓存,并在启动应用程序的新实例时重新编译每个类。
Any idea why is the RAM usage is higher in lollipop?
保持与现有应用的向后兼容性。 ART 使用与 Dalvik 相同的输入字节码,通过标准 .dex 文件作为 APK 文件的一部分提供,而 .odex 文件替换为可执行和可链接格式 (ELF) 可执行文件。使用 ART 的设备上 dex2oat 实用程序编译应用程序后,它仅从编译的 ELF 可执行文件运行;这种方法消除了JIT编译的各种开销,但在安装应用程序时需要额外的编译时间,并且应用程序占用稍大的空间来存储编译后的代码。
Is there a tool to visualize the RAM allocations of the app?.
cat/proc/meminfo - 这将给出一些内存统计信息。如果您添加“memfree + cached”,您将获得总可用内存。dumpsys meminfo-这将为所有当前进程提供内存信息dumpsys meminfo - 为特定进程转储。
除此之外,您还可以使用 Eclipse MAT 插件来分析 JVM 堆内容。
关于android - Android L 与 Kitkat 中的 RAM 使用情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27617525/
话说,尾部的++在这里没有实际作用? 最佳答案 l+l++ 未定义。您的表达式中没有序列点来分隔对 l 的访问和后增量。它可以做任何事情,包括具有与 l+l 相同的效果。 编辑:问题和答案在 Why
我正在研究成员资格算法,我正在研究这个特定问题,该问题说明如下: 展示一种算法,给定任何常规语言 L,确定 L 是否 = L* 所以,我的第一个想法是,我们有 L*,它是 L 的 Kleene 星并确
我试图弄清楚如何使用 Javascript 生成一个随机 11 个字符串,该字符串需要特定的字母/数字序列,以及位置。 ----------------------------------------
我一直在 LinqPad 中试验查询。我们有一个表 Lot,其中有一列 Side char(1)。当我编写 linq to sql 查询 Lots.Where(l => l.Side == 'A')
这个问题在这里已经有了答案: Iterate over all pairs of consecutive items in a list [duplicate] (7 个答案) 关闭 7 年前。 假
列表 ['a','a #2','a(Old)'] 应变为 {'a'} 因为 '# ' 和 '(Old)' 将被删除,并且不需要重复项列表。我努力用生成器开发列表理解,并决定这样做,因为我知道它会起作用
我正在为蛇和梯子制作一 block 板,到目前为止,我已经按降序打印了板。但是,我需要以正确的方式打印电路板。 编辑“螺旋下降”意味着 100...91 81...90 80...71 ...
字符串“Hello\n”等于 {'H','e','l','l','o','\','n','\0'} 或 {'H','e','l','l','o','\n','\0'}? 是否在字符串定义中添加转义序列
这个问题在这里已经有了答案: Different behaviour for list.__iadd__ and list.__add__ (3 个答案) 关闭 8 年前。 ls = [1,2,3]
当我在编写一个程序时,我在我的代码中看到了一个奇怪的行为。这是我所看到的。 >>> l = [1,2,3,4,5,6,7,8] >>> g = [] >>> for i in l: ... g
我明白了what a Y Combinator is , 但我不明白这个来自 Wikipedia page 的“新颖”组合子的例子: Yk = (L L L L L L L L L L L L L
Exception ParseException is not compatible with throws clause in Comparator.compare(L, L). 我在java 6上
期望的输出 我想要一个函数返回一个列表,这样,给定一个“困惑的”列表 l,每个元素都是 l 对应元素的索引,如果 l 已排序。 (抱歉,我想不出更简单的说法。) 示例 f([3,1,2]) = [2,
你好,我正在查看“假设一个排序数组在你事先不知道的某个枢轴旋转。(即 0 1 2 4 5 6 7 可能变成 4 5 6 7 0 1 2)”这个问题的 C++ 解决方案。你如何有效地在旋转数组中找到一个
让我们考虑这个简单的例子: import numpy as np a=np.arange(90) a=a.reshape(6,3,5) 我想得到一个数组 b形状 (6*5,3+1=4) 与 b[0:6
我正在编写一个 q 脚本,它在特定路径中加载一个数据库并对其进行一些处理。 db 的位置目前在脚本中是硬编码的,但我想将 db 路径作为参数传递并让它从变量中的路径加载。 目前它看起来像这样: q)
为什么我收到错误 Device: (3:9741) (0,l.useLinkBuilder) is not a function。 (在 '(0,l.useLinkBuilder)()' 中,'(0,
我有 ADT 版本 23.0.4 并安装了 Android 5.0 的 SDK 平台。 我读到 Android 5.0 Lolipop 的 API 级别为 21。但是在 Eclipse 的“新建应用程
我在 Google Play Store 中实现了一个抽屉导航,我想在 DrawerLayout 中设置列 TableView 的选定项目。但是后来发现在touch模式下无法选中item,有一个i
作为 C++ 的新手,我基本上有一个关于 g++ 编译器的问题,尤其是库的包含。考虑以下生成文件: CPPFLAGS= -I libraries/boost_1_43_0-bin/include/ -
我是一名优秀的程序员,十分优秀!