获取更多内存

虽然系统对每个App有内存限制,但根据它内存分配的规则,开发者仍然可以通过一些trick的方式来偷取更多内存。

通过子进程

App的组件默认运行在同一个进程中,而Android系统的内存分配也是通过进程来进行分配的,那么通过android:process指定新的进程后,即可申请新的内存分配。当然,一个App多进程也会造成更多的系统开销和跨进程调用的麻烦。在Android App开发中,有一个组件经常使用到子进程,那就是——Webview。由于Webview的内存回收非常麻烦而且很难回收完全,所以业内普遍的做法是让Webview运行在单独的子进程中。通过kill Process的方式来完全回收内存。

通过使用Native Heap

Android系统限制的是Java Heap的内存大小,而Native Heap的内存分配是由系统控制的,不受大小限制。

因此通过jni就可以实现对Native Heap的申请。最新的图片加载框架Fresco,实际上就是通过在Native Heap上进行内存分配来减少Java Heap的内存大小,从而避免因图像内存占用过大而造成的OOM。

使用OpenGL

OpenGL的很多API同样是不受Java Heap限制的,因为OpenGL将RAM的一部分作为显存使用。有很多图像处理类的App,就是通过将图片转换为Texture来使用OpenGL进行处理,从而避免太大的内存占用,提高了处理的效率。

LargeHeap

在AndroidMainifest文件中,可以通过设置LargeHeap参数强制给App分配更大的内存空间,该属性适用于那些在运行时需要处理大量数据、图片等内容的App。但该方法类似于“七伤拳”,在获取更大内存的同时也加大了GC的难度,使GC速度变慢而且在应用退到后台时,也更容易被系统回收。所以,开发者需要评估App是否真的需要使用该属性。