Random-access Memory(RAM)无论在那种软件开发环境中都是一种宝贵的资源,而在经常内存拮据的移动操作系统上尤其宝贵。即使android拥有很好的垃圾回收机制,我们也很难忽视APP该在什么时候什么地方分配和释放内存。

Android是怎样管理内存的?

Android没有为内存提供交换空间,但会使用paging和memory-mapping(mmapping)来管理内存。这就意味着,任何对内存的修改都会在RAM上留下有残留。所以完全释放APP内存的方法只有释放可能持有的对象引用,以便垃圾回收器回收内存。

共享内存

Android为了满足RAM的规范,会尝试着在进程间共享RAM页,一般会通过一下几种方式来实现共享:

①每个APP进程都是从一个叫Zygote的进程分出来的。Zygote进程是实在系统启动且加载框架代码和资源时启动的。要想启动一个新的APP进程,系统会先从Zygote进程中分出一个新的进程,然后在这个新的进程上加载和运行APP的代码。这使得大多数的内存页(为框架代码和资源分配的)在所有APP进程间得以共享。

②大部分静态数据会被安排在一个进程内。这样不仅使得进程间相同数据得以共享,而且还能在需要的时候被page out. 这样的静态数据有:.odex、.apk、.so文件等。

③在很多地方,Android会在进程间分享相同的动态RAM,通过显式地分配内存区域。

分配和回收APP内存

下面从几个方面介绍Android分配和回收APP内存:

①Dalvik虚拟机为每个进程提供的堆大小受到单个虚拟机内存空间范围的限制。Dalvik也会根据APP使用情况来分配合理的内存。

②合理的堆大小并不是堆使用的物理内存大小。

③Dalvik堆并没有对堆的逻辑大小紧凑化,也就是Android并没有整理磁盘碎片来关闭空间。当有未使用的空间时,Android只会在堆的尾部收缩堆的逻辑大小。但是这并不意味之堆使用的物理内存不会收缩。