Android虚拟机内存参数说明

ART的比较复杂,这里分析dalvik虚拟的的参数,和art参数的概念是一致的

-xms: 虚拟机堆的起始大小,启动时申请的堆内存大小 prop:dalvik.vm.heapstartsize指定
-xmx: 虚拟机堆使用的虚拟内存最大大小 prop:dalvik.vm.heapsize 指定
-XX:HeapGrowthLimit: 非largeHeap应用最大使用的堆内存 prop:dalvik.vm.heapgrowthlimit
-XX:HeapMinFree 堆最小空闲值,空闲值小于该值时应该扩容堆(调整软限制) prop:dalvik.vm.heapminfree 指定
-XX:HeapMaxFree 堆最大空闲值,大于该值时应该堆缩容(调整软限制) prop:dalvik.vm.heapmaxfree
-XX:HeapTargetUtilization 目标利用率,扩容和缩容的根据目标利用率找到合适的目标堆大小(调整软限制) prop:dalvik.vm.heaptargetutilization
-XX:+DisableExplicitGC 禁止显式gc

首先Android使用mspace系列函数进行内存管理
包括如下几个重要函数
DLMALLOC_EXPORT mspace create_mspace(size_t capacity, int locked)
DLMALLOC_EXPORT size_t destroy_mspace(mspace msp)
这两个操作相当于批发一块虚拟内存,其实就是使用系统调用sys_mmap申请虚拟内存

DLMALLOC_EXPORT void* mspace_malloc(mspace msp, size_t bytes);
DLMALLOC_EXPORT void mspace_free(mspace msp, void* mem);
这两个函数用于从批发的连续虚拟内存中申请和释放内存,相当于零售操作

DLMALLOC_EXPORT size_t mspace_footprint(mspace msp);
当我们零售内存的时候是把我们批发来的一整款虚拟内存进行分割,为了方便管理以及减少碎片,我们肯定是从最小的内存开始向外零售,
mspace_footprint函数的返回值代表我们现在切割到整块虚拟内存的最大值

size_t mspace_set_footprint_limit(mspace msp, size_t bytes) mspace_mallocmspace_footprint+
bytesmspace_set_footprint_limitfootprint_limitNULL

1 android虚拟机就是使用这些函数去管理内存的,首先当虚拟机初始化完成后会创建堆,使用create_mspace创建一块连续虚拟内存,
也就是我们使用的-xmx指定的内存大小(注意这里是虚拟内存,由于操作系统的页面映射机制,这里并没有映射真正的物理内存,
也就是说vss现在是有值的)

2 然后会使用mspace_set_footprint_limit 函数去限制可分配的内存大小。这个值最开始设置成-xms指定的大小。所以我们的堆一开始在申请内存的时候,都会成功,直到第一次超出-xms大小,才会出发gc,或者引起堆的增长

3 那么堆是怎样增长的呢,在分配内存的时候首先会尝试gc,如果gc后还是分配不到的话,就会通过mspace_set_footprint_limit增大可分配大小来扩展堆,这样就可以分配到内存了

4 另外三个参数-XX:HeapMinFree-XX:HeapMaxFree -XX:HeapTargetUtilization是指导我们对堆进行扩展和收缩的。 在gc的过程中我们会发现堆的空闲内存可能小于-XX:HeapMinFree 或者大于-XX:HeapMaxFree,这时候我们的堆大小就不合适了,再进行内存分配的话可能浪费内存或者频繁出发gc,所以我们就会进行堆的修剪,指导的参数就是-XX:HeapTargetUtilization,我们需要把堆的大小修剪为-XX:HeapTargetUtilization指定的利用率。那么怎么计算堆利用率呢? 也就是怎么知道堆的空闲大小?? 就是用mspace_set_footprint_limit减去mspace_footprint,这样就得到了空闲大小。(注意mspace_footprint这个值会在分配对象和释放对象的时候进行加减)

5 再来说说-XX:HeapGrowthLimit, 这个参数在应用没有指定android:largeHeap的时候,该值就是前面说的-xmx指定的最大堆大小,如果设置了android:largeHeap则-xmx使用-xmx指定的堆大小

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章