Dalvik和ART的Heap都使用ashmem作为底层的内存分配器,这里的Heap指java heap。除了Heap本身,用于管理Heap的一些数据结构,比如cardtable,bitmap,markstack等也都使用ashmem作为底层的内存分配器。
在创建Heap时,VM使用/dev/ashmem/作为句柄,调用mmap函数映射一块虚拟地址。需要注意的是,mmap使用MP_PRIVATE作为参数,实现copy-on-write的map。也就是说,在没有真正的写操作时,返回的虚拟地址指向一页清零的物理内存——当写操作发生时,新创建申请一页物理内存并且清零(用拷贝来清零),以后的页面都是这样按需分配。
按照上面的理解,增加dalvik.vm.heapsize并不会增加Android系统的物理内存消耗。