使用多进程原因:
·防止系统资源紧张(OOM)
·防止应用架构臃肿(WebView、推送、后台服务)
OOM:
OOM(内存溢出):是因为应用所需要分配的内存超过系统对应用内存的阈值,而抛出的 java.lang.OutOfMemoryError错误。 OOM的根本原因是开发者对内存使用不当造成的。
Android系统仅会在新的内存分配之前判断Heap的尾端剩余空间是否足够,如果不够就会触发GC操作,从而腾出更多空闲的内存空间。为了整个Android系统的内存控制需要,Android系统为每个应用程序都设置了一个硬性的 DalvikHeapSize最大限制阈值,这个阈值在不同的设备上回因为RAM大小不同而有所差异。如果你的应用占用内存空间已经接近这个阈值,此时再尝试分配内存的话,很容易引起 OutOfMemoryError的错误。
// 获取Heap Size阈值
ActivityManager am = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);
// 返回值是以Mb为单位
int memoryClass = am.getMemoryClass();
只要allocated + 新分配的内存 >= getMemoryClass()的时候就会发生OOM。
如何避免OOM:
· 尽量减少新分配出来的对象占用内存的大小,尽量使用更加轻量级的对象;
· 使用更加轻量的数据结构(比如使用 ArrayMap/ SparseArray替代HashMap等传统数据结构);
·避免在Android里面使用枚举;
·减小Bitmap对象的内存占用(可以通过缩放避免不必要的大图载入或者选择不同的解码格式);
·避免在onDraw方法里面执行对象的创建(类似onDraw等频繁调用的方法,一定需要注意避免在这里做创建对象的操作,因为它会迅速增加内存的使用,而且很容易引起频繁的GC,甚至是内存抖动。)
·当代码中需要使用到大量的字符串拼接操作,就有必要考虑使用StringBuilder来代替频繁的“+”;
· 避免对象的内存泄漏(内存对象的泄漏,会导致一些不再使用的对象无法及时释放,这样很容易导致后续需要分配内存的时候,空闲空间不足而出现OOM。显然,这还使得每级Generation的内存区域可用空间变小,GC就会更容易被触发,容易出现内存抖动,从而引起性能问题。)关于内存泄漏,主要有以下几点:
(1) 注意Activity的泄漏(内部类引用导致Activity的泄漏或者Activity Context被传递到其他实例中,这可能导致自身被引用而发生泄漏。);
(2)注意临时Bitmap对象的及时回收 ;
(3)注意监听器的注销(手动add的listener,需要记得及时remove这个listener);
跨进程IPC: