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


72

有谁知道Android手机上的堆大小是否根据操作系统版本中的设置是恒定值,还是这是电话生产商可以决定的设置?

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

我只发现有人说应用程序的堆大小为16M的文章。但是,这些文章有些陈旧。以我为例,在一个特定模型上,堆大小从20M到24M不等。这款手机具有768M的RAM。


如果der是应用程序总堆的30mb。如果仅分配了7 mb而剩余空间是免费的,则扩孔内存可以被其他应用程序使用吗?
Chaitanya Chandurkar

Answers:


52

有谁知道Android手机上的堆大小是否根据操作系统版本中的设置是恒定值,还是这是电话生产商可以决定的设置?

从技术上讲,这是电话生产商可以决定的设置。Android是开源的。我不记得《兼容性定义文档》中阐明了堆大小的要求,尽管我最近没有看。

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

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

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

搜索StackOverflow[android] "heap size"会得到这个答案


1
是的,我也看到了这个答案。我只是想知道是否有任何指导方针,以及RAM是否与此有关。我想我们只希望制造商遵守Google准则。感谢您的输入。我之所以这样问,是因为我发现特定手机的内存不足问题有所增加。
埃里克·诺德维克

124

从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
  • 三星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

平板电脑(Android版):

  • 三星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
  • 宏cer 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 2013年

2
来自h2g2在xdadeveloper中的一篇文章:heapstartsize是初始化时新Dalvik VM堆的大小。heapgrowthlimit是普通Dalvik VM堆的大小限制。heapsize是在其应用清单中指定android:largeHeap = true的Android应用的大小限制。
云涛

1
在“ Google Galaxy Nexus(4.3)= 8/96 / 256MB”中,为什么会有多个堆大小?8?96?256?
山姆YC 2014年

7
这些值是heapstartsize,heapgrowthlimit,heapsize。有关更多信息,请参见jeffmixon.com/…
空间论者2014年

21

不仅电话生产者,而且创建Android OS版本的任何人都可以根据其设备的特定要求指定允许的最大堆大小。一些Android根目录(例如CyanogenMod)甚至允许用户自己选择堆大小作为设置。

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

Runtime.getRuntime().maxMemory();

有关此主题的其他信息,请单击此处

如果您的应用程序通常需要超过16MB的堆,建议的方法是在清单中设置最低操作系统版本级别,以确保下载应用程序的绝大多数用户至少具有所需的数量,然后找到一种以适度的方式降低功能性的方法,可以根据需要将堆需求降低到16MB的基本级别,以适应少数用户无法通过该筛子的最佳堆数量的情况。

以下是一些数字,显示了电话RAM与OS版本(基于当前OS,而非原始OS)的关联。我相信,至少具有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 2014年

2
@NoBugs:不幸的是,Google Play商店目前不提供一种基于堆大小来筛选哪些设备可以看到您的应用程序的方法,因此对于大多数用户,必须使用不太精确的条件才能达到这种效果。通常,更高版本的OS将在具有更大堆大小的设备上使用。因此,指定较高的版本将导致大多数设备具有更多可用堆。当遇到该规则的异常时,应用程序应正常降级。
2014年

11

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

getprop dalvik.vm.heapsize

在Android终端(connectbot或adb shell等)上。也可以重新挂载读写文件,并在build.prop文件中设置堆大小。(请确保已安装恢复功能,以便在不小心将恢复功能设置得太小而无法启动时进行重新设置)。


9

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

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

  • G1 = 16 Mb
  • Droid = 24 Mb
  • 连结一= 32 Mb
  • Xoom = 48 Mb
  • GalaxyTab = 64 Mb。

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


HTC Desire(v 2.3.3)= 32MB Samsung Galaxy R GT-I9103(v 2.3.5)= 64MB
空间论家

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呢?
android开发人员

更新了答案,提到所有Android 4.x版本都有这样的表列表。虽然不是早期版本。
Mattias Isegran Bergander

我不明白。您是说对于3.0到4.1版本,没有堆需求的描述?
android开发人员

答案中的链接文档(平台的每个版本一个)中有一张表,该表针对所有4.x版本(当前为4.0、4.1和4.2)描述,那里的所有版本4.x(含义为4点)就是这样一张桌子。
Mattias Isegran Bergander 2013年

好的,我还是不明白。您能否更新您的答案以包括每个版本(或版本范围)具有多少最小堆大小?
Android开发人员

0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.