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指定的堆大小

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