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 上的 Stock Android 2.3(我猜)非常激进,以至于我们无法分配超过 13MB 的图像。看起来你有很多可用内存,然后突然繁荣 - 你的应用程序已关闭。
您可以使用本机内存。每个 Android 应用程序(或多或少)都是一个 linux 进程,它可以使用直接 malloc 调用为自己分配内存。您需要 JNI 和 C 代码,但使用它您可以访问整个内存并做任何您想做的事情。同样,请注意,当可用内存量变得太低时,系统将终止您的应用程序。
您可以使用多个进程来拆分您的应用程序并在它们之间划分内存使用量。这不是那么方便,但它可以工作,并且一些库使用它来获取比乍一看更多的资源。
除此之外,您必须记住,某些对象可能使用比您想象的更多的内存。例如,硬件加速有点棘手。大多数设备不支持非二次幂大小的纹理。这意味着当您启用 ImageView (300x50px) 并启用硬件加速时,Android 将为您分配一个 512x64px 的 ImageView 纹理。它必须这样做,因为一切都是由 OpenGL 绘制的,它需要纹理。有了这样的纹理,你的 ImageView 占用的内存比没有硬件加速的情况下要多 2.5 倍。此外,如果您的 View 是动画的,Android 必须在每个动画帧中重建纹理。
To sum up - Android can be tricky, when it comes to memory management. Heap growing to larger value may not be wrong as sometimes you need larger amount of memory (for example when creating a gallery). You should be aware that there is a lot of different things that can affect your app memory usage and try to stay as low as possible.