Android 内存管理并不是那么简单,当涉及到内存使用时,您应该始终保持尽可能低的水平。
每个 Android 设备的可用内存量都是有限的。在大多数情况下,它与屏幕尺寸、CPU 计算能力和其他一些因素有关(例如 3D 屏幕在某些情况下需要两倍的内存)。 Nexus One 有 32MB,Galaxy Nexus - 64MB,平板电脑甚至可以有更多。最大堆大小可以在系统设置中更改。 Cyanogen Mod 可以非常轻松地进行调整。
较旧的 Android(2.3 之前?)将此内存限制分为两部分 - 标准(普通对象、UI、字符串等)和多媒体(图像、音频缓冲区、OpenGL 内容、相机框架)。 Android 2.2 的 Nexus One 拥有 16MB/16MB 堆,有时会很烦人,因为您可能会加载 16MB 图像和 100KB UI,导致显示简单图库的应用程序崩溃。
有些设备不允许您分配太大的内存块。例如,Galaxy Nexus 的限制为 31.9999MB。此外,您尝试分配的连续内存块越大,系统完成此类分配所需的时间就越多。它必须重新分配一些东西才能找到这么大的内存块。
较新的 Android 具有 largeHeap 标志,可提供大量内存。通常是平时的 5 倍左右。虽然听起来不错,但不建议使用largeHeap(调试除外),因为它可能会导致严重的内存使用问题。基本上系统本身需要一些内存。如果您使用的内容超出了应有的范围,Android 会在没有任何通知的情况下杀死您的应用程序,从最近最少使用的应用程序开始。
根据系统版本和实现的不同,垃圾收集器可能有不同的策略。 Nexus One 上的原生 Android 2.3(我猜)非常激进,以至于我们无法分配超过 13MB 的图像。您可能看起来有大量可用内存,但突然间,您的应用程序崩溃了。
您可以使用本机内存。每个 Android 应用程序(或多或少)都是一个 Linux 进程,它可以使用直接 malloc 调用为自己分配内存。您需要 JNI 和 C 代码,但使用它们您可以访问整个内存并做任何您想做的事情。再次警告,当可用内存量变得太低时,系统将终止您的应用程序。
您可以使用多个进程来拆分您的应用程序并在它们之间分配内存使用量。虽然不是那么方便,但它确实有效,一些图书馆使用它来获取比乍一看应有的更多资源。
除此之外,您必须记住,某些对象可能使用比您想象的更多的内存。例如,硬件加速有点棘手。大多数设备不支持非二次方大小的纹理。这意味着当您有一个 ImageView (300x50px) 并启用了硬件加速时,Android 将为您的 ImageView 分配一个 512x64px 纹理。它必须这样做,因为一切都是由 OpenGL 绘制的并且需要纹理。使用这样的纹理,您的 ImageView 比没有硬件加速时占用的内存多大约 2.5 倍。另外,如果您的视图是动画的,Android 必须在每个动画帧中重建纹理。
总而言之,Android 在内存管理方面可能会很棘手。堆增长到更大的值可能不会错,因为有时您需要更大的内存(例如创建图库时)。您应该意识到,有很多不同的因素会影响您的应用程序内存使用量,并尽量保持较低的使用量。