【问题标题】:Android heap size on different phones/devices and OS versions不同手机/设备和操作系统版本上的 Android 堆大小
【发布时间】:2011-07-18 01:16:19
【问题描述】:

有谁知道 Android 手机上的堆大小是根据操作系统版本中设置的常量值还是手机制造商可以决定的设置?

堆大小是否与手机上的 RAM 量成正比?

我只发现有人说应用程序的堆大小为 16M 的文章。但是,这些文章有点旧。举个例子,我看到的堆大小在一个特定模型上从大约 20M 到 24M 不等。这款手机拥有 768M 内存。

【问题讨论】:

  • 如果 der 到应用程序的总堆为 30mb。如果只分配了 7 mb 并且剩余是空闲的,那么其他应用程序可以使用扩孔内存吗?

标签: android heap-memory


【解决方案1】:

有谁知道 Android 手机上的堆大小是根据操作系统版本中设置的常量值还是手机制造商可以决定的设置?

从技术上讲,这是手机制造商可以决定的设置。安卓是开源的。我不记得兼容性定义文档中详细说明了堆大小要求,尽管我最近没有看过。

堆大小是否与手机上的 RAM 量成正比?

不,它往往更多地基于屏幕分辨率,因为更高分辨率的屏幕往往想要处理更大的位图,因此 Google 提出了堆大小建议,希望设备制造商能够遵守。

我只发现有人说应用程序的堆大小为 16M 的文章。

[android] "heap size" 上搜索 StackOverflow 会出现 this answer

【讨论】:

  • 是的,我也看到了这个答案。我只是想知道是否有任何指导方针,以及 RAM 是否与此有关。我想我们只需要希望制造商遵守谷歌的指导方针。感谢您的输入。我之所以问这个问题是因为我发现特定手机的 OutOfMemory 问题有所增加。
【解决方案2】:

允许应用程序使用的“VM 预算”因设备而异。平板电脑通常允许比手机更大的预算。

以下是我为各种设备找到的一些 VM 预算大小。

  • G1 = 16 Mb
  • 机器人 = 24 Mb
  • Nexus One = 32 Mb
  • Xoom = 48 Mb
  • GalaxyTab = 64 Mb。

(注意:如果您发现不同,请告诉我)

【讨论】:

  • HTC Desire (v 2.3.3) = 32MB 三星 Galaxy R GT-I9103 (v 2.3.5)= 64MB
【解决方案3】:

从 build.prop 文件中提取的更多设备信息(adb -d pull /system/build.prop):

手机(Android 版):

  • HTC Wildfire (2.2.1) = 16MB
  • HTC Wildfire S (2.3.5) = 20MB
  • HTC 莎莎 (2.3.3) = 20MB
  • HTC Desire (2.3.3) = 32MB
  • HTC Desire S (2.3.5) = 32MB
  • Sprd - Richview - S111 (2.3.5) = 32MB
  • 三星 Galaxy S GT-I9000 (2.2) = 48MB
  • 三星 Galaxy R GT-I9103 (2.3.5) = 64MB
  • 三星 Galaxy Y GT-S5360 (2.3.5) = 64MB
  • 三星 Galaxy Note N7000 (4.1.2) = heapstartsize=8m, heapgrowthlimit=64m, heapsize=256m
  • 三星 Galaxy S3 GT-I9300 (4.3, xhpdi) = 8/64/256MB
  • 三星 Galaxy S4 GT-I9505 (4.4, xxhpdi) = 8/128/512MB
  • Google Galaxy Nexus (4.3) = 8/96/256MB
  • Google Nexus 4(4.4,xhdpi)= 8/192/512MB
  • Google Nexus 5(4.4,xxhdpi)= 8/192/512MB
  • 三星 Galaxy S6 SM-G920W8 (7.0) = 8/256/512MB

平板电脑(安卓版):

  • 三星 Galaxy Tab GT-P1000 (2.2) = 48MB
  • 三星 Galaxy Tab 8.9 GT-P7300 (3.2) = 5/64/288MB
  • 三星 Galaxy Tab 10.1 GT-P7500 (3.2) = 5/64/288MB
  • 三星 Galaxy Tab 3 10.1 GT-P5200 (4.2, mdpi) = 8/96/256MB
  • 宏碁 Iconia A500 (3.2.1) = 5/48/256MB
  • Kindle Fire HD 7" (4.0.3) = 5/48/256MB
  • 华硕 Transformer Prime TF201 (4.1.1) = 5/48/256MB
  • Nexus 10 (4.4.3) 16/192/512 MB

【讨论】:

  • 值得注意的是,清单应用程序属性android:largeHeap="true" 似乎将可用堆空间从“heapgrowthlimit”值增加到“heapsize”值。不过,这会因设备而异。
  • 来自 h2g2 在 xdadeveloper 中的一篇文章:heapstartsize 是初始化时新的 Dalvik VM 堆的大小。 heapgrowthlimit 是正常 Dalvik VM 堆的大小限制。 heapsize 是在其应用程序清单中指定 android:largeHeap=true 的 Android 应用程序的大小限制。
  • 在“Google Galaxy Nexus (4.3) = 8/96/256MB”中,为什么会有多个堆大小? 8? 96? 256?
  • 这些值为 heapstartsize、heapgrowthlimit、heapsize。请参阅jeffmixon.com/… 了解更多信息。
【解决方案4】:

不仅手机制造商,任何创建 Android 操作系统版本的人都可以根据其设备的具体要求指定允许的最大堆大小。一些 Android 根,例如 CyanogenMod,甚至允许用户自己选择堆大小作为设置。

您可以使用方法检测最大允许的堆大小

Runtime.getRuntime().maxMemory();

有关此主题的更多信息,请访问here

如果您的应用通常需要超过 16MB 的堆,建议的方法是在清单中设置最低操作系统版本级别,以确保绝大多数下载您的应用的用户至少拥有您需要的数量,然后找到一种方法来优雅地降低您的功能,从而根据需要将堆需求降低到 16MB 的基本级别,以供少数用户通过该筛子而导致的堆需求少于您的最佳数量。

以下是一些显示手机 RAM 与操作系统版本关联的数据(基于当前而非原始操作系统)。我相信至少有 1GB RAM 的手机几乎总是会有超过 16MB 的堆。请注意,此处的百分比是针对支持指定内存的手机型号的数量,而不是使用中的手机总数,这可能非常偏向某些型号。这些数字是通过将输入插入以下手机查找器(包括 1500 款 Android 手机型号)获得的,因此只是大致数字:http://www.gsmarena.com/search.php3

具有至少 1GB RAM 的手机型号百分比,按当前操作系统版本(不是发布时的版本):

Phones running         Percent of models having at least 1GB of RAM   Percentage of all models
4.4 and up             100 percent                                    1.5
4.3 and up             100 percent                                    2.9
4.2.x and up           74 percent                                     18.7
4.1.x and up           71 percent                                     37
4.0 and up             62 percent                                     60
2.3.x and up           57 percent                                     71
2.2 and up             44 percent                                     93
2.1 and up             44 percent                                     97
ALL OS VERSIONS:       41.5 percent                                   100

【讨论】:

  • 最低操作系统级别有何帮助?甚至 KitKat 4.4 现在也针对低 RAM 设备进行了优化。
  • @NoBugs:不幸的是,Google Play 商店目前没有提供一种方法来根据堆大小过滤哪些设备可以看到您的应用程序,因此必须使用不太精确的标准来达到这种效果对于大多数用户。通常,更高版本的操作系统将在具有更大堆大小的设备上。因此,指定更高版本应该会导致大多数设备拥有更多可用堆。当遇到该规则的例外情况时,应用程序应该正常降级。
【解决方案5】:

您应该能够使用以下方法检查最大虚拟机堆大小:

getprop dalvik.vm.heapsize

在 Android 终端(connectbot 或 adb shell 等)。也可以在 build.prop 文件中重新安装读写并设置堆大小。 (确保您安装了恢复功能,这样如果您不小心将其设置得太小,您可以重新设置它,它不会启动)。

【讨论】:

    【解决方案6】:

    实际上有一个定义的最小应用程序内存取决于屏幕大小和密度:

    移动设备通常具有有限的系统资源。安卓 设备可以有低至 16MB 的内存可供单个设备使用 应用。 Android 兼容性定义文档 (CDD), 第 3.7 节。虚拟机兼容性提供了所需的最低要求 适用于各种屏幕尺寸和密度的应用程序内存。 应优化应用程序以在此最小内存下执行 限制。但是,请记住,许多设备都配置了更高的 限制。

    引用自:http://developer.android.com/training/displaying-bitmaps/index.html

    但正如其他人所说,每个设备制造商都会决定设备的实际价值,因此它可能会大于这个(但不能更小)。

    上述兼容性定义文档 (CDD) 列出了每个 android 版本的最低要求: https://source.android.com/compatibility/cdd.html

    对于最新版本的 Android,有一个 html 版本可用,我们可以直接链接到那里的运行时内存部分: https://source.android.com/compatibility/android-cdd.html#3_7_runtime_compatibility

    对于 Android 2.3:

    屏幕分类为中等或 低密度必须配置 Dalvik 分配至少 16MB 内存 到每个应用程序。屏幕分类为的设备实现 高密度或超高密度必须配置 Dalvik 分配 每个应用程序至少有 24MB 的内存。请注意,设备 实现可能会分配比这些数字更多的内存。

    对于现代版本,有一个表格,它取决于屏幕密度等:

    对于 Android 4.2,该表中的示例行:

    小/正常/大尺寸和xhdpi密度:64MB

    对于 Android 6,提取:

    小/正常 xhdpi:80MB

    小/正常 xxhdpi:128MB

    小/正常 xxxhdpi:256MB

    这些文档中也有其他 Android 2.x、4.x、5.x 和 6 版本的表格(参见上面的 CDD 链接)。

    请参阅此 google 链接以轻松查找特定设备的屏幕密度等: https://design.google.com/devices/

    【讨论】:

    • 2.3 和 4.2 之间的其他版本的 android 呢?
    • 更新了答案,提到所有 Android 4.x 版本都有这样的表格列表。但不是早期版本。
    • 我不明白。你的意思是对于 3.0 到 4.1 版本,没有堆要求的描述?
    • 在答案的链接文档中(平台的每个版本一个)有一个表,如所有 4.x 版本(当前为 4.0、4.1 和 4.2)所描述的所有版本的含义 4 .x(4个点的东西)有这样的表。
    • 好吧,我还是不明白。您能否更新您的答案以包括每个版本(或版本范围)有多少最小堆大小?
    【解决方案7】:

    这些数据对我有用。 选择模拟器平板安卓电视 内存 1536MB 虚拟机堆 16MB 内部存储 800MB 工作室管理 100

    【讨论】:

      猜你喜欢
      • 2017-11-29
      • 2011-05-04
      • 2020-08-25
      • 2012-03-17
      • 2016-01-25
      • 1970-01-01
      • 1970-01-01
      • 2022-11-05
      • 2014-05-27
      相关资源
      最近更新 更多