什么是一个应用程序可以使用的RAM的最大数量?

我对这个关于Android操作系统内存pipe理的问题非常好奇,所以我希望对这个问题有一个比较详细的回答。

我想知道的是:

  • 什么是Android应用程序(不是系统应用程序)可以使用的最大内存量 (以兆字节 /占总内存的百分比 )?
  • Android版本有什么区别?
  • 有关设备制造商有任何分歧吗?

最重要的是:

  • 考虑哪些“副因素” /当系统确定应用程序在运行时可以使用多lessRAM(假设每个应用程序的最大内存不是静态数)时, 它依赖于什么

到目前为止我所听到的(直到2013年):

  • 早期的Android设备的每个应用程序上限为16MB
  • 后来这个上限增加到24MB或32MB

什么让我非常好奇:

这两个限制都非常低。

我刚刚下载了Android任务pipe理器来检查我的设备RAM。 我注意到,有些应用程序使用大约40-50兆字节的RAM,比上面提到的最大RAM使用量要多32MB。 那么Android如何确定应用程序可以使用多less内存? 应用程序如何超过这个限制?

此外,我注意到,使用大约30-40兆字节时,我的一些应用程序崩溃(系统死亡?)与OutOfMemoryException 。 另一方面,我有一些应用程序在我的手机上运行一段时间(可能是由于内存泄漏),使用100 MB或更多 ,不会崩溃或死亡。 所以显然也取决于应用程序本身,当涉及到确定有多less内存可以保留。 这怎么可能? (我用768 MB RAM的HTC One S进行了testing)

预先感谢您的解释。

免责声明:我不以任何方式附属于Android任务pipe理器应用程序。

什么是Android应用程序(非系统应用程序)可以使用的最大内存量(以兆字节为单位/占总内存的百分比)?

这取决于设备。 ActivityManager上的getMemoryClass()将为您提供您的代码运行的设备的值。

Android版本有没有区别?

是的,就操作系统的要求在过去几年中有所增加而言,设备必须调整以匹配。

在设备制造商方面是否存在差异?

是的,只要制造商生产设备,尺寸因设备而异。

在确定应用程序可以使用多less内存时,将哪些“副因素”考虑在内?

我不知道“副作用”是什么意思。

早期的设备有一个16MB的应用程序上限; 后来的设备增加到24MB或32MB

这是正确的。 屏幕分辨率是一个重要的决定因素,因为更大的分辨率意味着更大的位图,所以平板电脑和高分辨率手机将趋向于具有更高的价值。 例如,你会看到有48MB堆的设备,如果有更高的值,我不会感到惊讶。

应用程序如何超过这个限制?

你认为那个应用程序的作者知道他在做什么。 考虑到一个核心Android工程师难以确定应用程序的内存使用情况 ,我不会认为这个应用程序必须提供特别准确的结果。

这就是说,本机代码(NDK)不受堆的限制。 而且,从Android 3.0开始,应用程序可以请求一个“大堆”,通常在几百MB的范围内,但是对于大多数应用程序来说这被认为是糟糕的forms。

此外,我注意到,使用大约30-40兆字节时,我的一些应用程序崩溃与OutOfMemoryException。

请记住,Android垃圾收集器不是一个压缩垃圾收集器。 exception真的应该是CouldNotFindSufficientlyLargeBlockOfMemoryException ,但这可能被认为太罗嗦。 OutOfMemoryException意味着你不能分配你的请求块 ,而不是完全用尽了你的堆。

每个应用的内存限制取决于屏幕大小和Android版本: https : //drive.google.com/file/d/0B7Vx1OvzrLa3Y0R0X1BZbUpicGc/view?usp=sharing

来源:Android兼容性下载http://source.android.com/compatibility/downloads.html ; 兼容性定义文档(CDD),部分虚拟机兼容性或运行时兼容性

这个答案深入到getMemoryClass()maxMemory()方法的行为中。