不同手机/设备和操作系统版本上的Android堆大小

74

有没有人知道安卓手机的堆大小是根据操作系统版本中设置的常量值,还是手机制造商可以决定这个设置?

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

我只找到一些文章,其中人们说应用程序的堆大小为16M。然而,这些文章有点过时了。从我所看到的,例如,在某个特定型号上,堆大小会从约20M变化到24M。这款手机有768M的RAM。


如果应用程序的总堆大小为30MB,但只分配了7MB,剩余的内存是空闲的,那么其他应用程序可以使用剩余的内存吗? - Chaitanya Chandurkar
7个回答

125

以下是从 build.prop 文件中提取的更多设备信息(通过 adb -d pull /system/build.prop 命令获取):

手机(Android 版本):

  • HTC Wildfire(2.2.1)= 16MB
  • HTC Wildfire S(2.3.5)= 20MB
  • HTC Salsa(2.3.3)= 20MB
  • HTC Desire(2.3.3)= 32MB
  • HTC Desire S(2.3.5)= 32MB
  • Sprd-Richview-S111(2.3.5)= 32MB
  • Samsung Galaxy S GT-I9000(2.2)= 48MB
  • Samsung Galaxy R GT-I9103(2.3.5)= 64MB
  • Samsung Galaxy Y GT-S5360(2.3.5)= 64MB
  • Samsung Galaxy Note N7000(4.1.2)= heapstartsize=8m,heapgrowthlimit=64m,heapsize=256m
  • Samsung Galaxy S3 GT-I9300(4.3,xhpdi)= 8/64/256MB
  • Samsung 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
  • Samsung Galaxy S6 SM-G920W8(7.0)= 8/256/512MB

平板电脑(Android 版本):

  • Samsung Galaxy Tab GT-P1000(2.2)= 48MB
  • Samsung 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
  • Acer 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

  • 12
    值得注意的是,清单应用程序属性android:largeHeap="true"似乎将可用堆空间从“heapgrowthlimit”值增加到“heapsize”值。但这会因设备而异。 - dokkaebi
    2
    从xdadeveloper的一篇帖子中,h2g2提到:heapstartsize是新Dalvik VM堆初始化时的大小。heapgrowthlimit是正常Dalvik VM堆的大小限制。heapsize是指在应用程序清单中指定android:largeHeap=true的Android应用程序的大小限制。 - Yuntao
    1
    在“Google Galaxy Nexus (4.3) = 8/96/256MB”中,为什么会有多个堆大小?8?96?256? - Sam YC
    7
    这些值是heapstartsize、heapgrowthlimit和heapsize。请参阅http://www.jeffmixon.com/examining-build-prop-tweaks-for-android-ics-a-comprehensive-guide-part-1/获取更多信息。 - spatialist

    52

    请问在Android手机上堆大小是根据操作系统版本设置的常量值还是手机制造商可以自行决定的设置?

    从技术上讲,这是由手机制造商自行决定的设置。Android是开源的。我不记得兼容性定义文档中有说明堆大小要求,但我最近没有查看过。

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

    不是,它往往更基于屏幕分辨率,因为高分辨率屏幕往往需要操作更大的位图,所以谷歌会提出堆大小建议,希望设备制造商能够遵守。

    我只找到了一些文章说应用程序的堆大小是16M。

    在 StackOverflow 上搜索 [android] "heap size" 会出现 这个答案


    1
    是的,我也看到了那个答案。我只是想知道是否有任何指导方针,并且RAM是否与此有关。我想我们只能希望制造商遵守Google的指南。感谢您的回答。我之所以提出这个问题,是因为我在某个手机上看到了OutOfMemory问题的增加。 - Eric Nordvik

    21

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

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

    Runtime.getRuntime().maxMemory();
    

    关于此主题的附加信息请点击此处

    如果您的应用程序通常需要超过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
    2
    @NoBugs: 不幸的是,谷歌应用商店目前没有提供一种基于堆大小来筛选设备可见性的方法,因此必须使用不太精确的标准来尝试为大多数用户实现该效果。通常,较新的操作系统版本将存在具有更大堆大小的设备上。因此,指定较高版本应导致大多数设备具有更多可用堆。当遇到该规则的例外情况时,应用程序应优雅地降级。 - Carl

    11

    您可以使用以下代码检查最大虚拟机堆大小:

    getprop dalvik.vm.heapsize
    

    在Android终端(如connectbot或adb shell等)上,可以通过重新挂载为读写模式并在build.prop文件中设置堆大小来进行操作。(确保已安装recovery,以便在意外将其设置得太小而无法启动时可以重新设置它)。


    9
    实际上,应用程序的最小内存大小取决于屏幕尺寸和密度。移动设备通常具有受限的系统资源。Android设备可以只为单个应用程序提供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 developer
    更新了答案,提到所有Android 4.x版本都有这样的表格清单。但早期版本没有。 - Mattias Isegran Bergander
    在答案中的相关文档(每个平台版本均有一个)中,描述了所有4.x版本(目前为止有4.0、4.1和4.2)的表格。这意味着所有4.x版本(4点某某)都这样一个表格。 - Mattias Isegran Bergander
    好的,我还是不太明白。您能否更新您的答案,包括每个版本(或版本范围)的最小堆大小是多少? - android developer
    我想知道缺失的 Android 版本,比如 3.x 版本以及版本之间的情况。 - android developer
    显示剩余4条评论

    9

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

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

    • G1 = 16 Mb
    • Droid = 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 - spatialist

    0

    这些数据对我来说是有效的。 选择模拟器平板电视 Android RAM 1536MB VM HEAP 16MB 内部存储 800MB Studio - 管理 100


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接