Android虛擬機器引數說明

2021-09-10 09:14:01 字數 2314 閱讀 3424

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) 釋放

這兩個操作相當於批發一塊虛擬記憶體,其實就是使用系統呼叫brk申請虛擬記憶體

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_malloc去申請記憶體的時候,mspace_footprint+

bytes是不允許超過mspace_set_footprint_limit設定的footprint_limit的,如果超過了,則直接分配失敗,返回null

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

Android虛擬機器記憶體引數說明

art的比較複雜,這裡分析dalvik虛擬的的引數,和art引數的概念是一致的 xms 虛擬機器堆的起始大小,啟動時申請的堆記憶體大小 prop dalvik.vm.heapstartsize指定 xmx 虛擬機器堆使用的虛擬記憶體最大大小 prop dalvik.vm.heapsize 指定 xx...

Java JVM虛擬機器引數

1,jvm 記憶體說明和虛擬機器引數 堆 heap 和非堆 non heap 記憶體 jvm記憶體 heap 類例項和陣列的記憶體 non heap 方法區 jvm內部處理或優化所需的記憶體 如jit 編譯後的 快取 每個類結構 如執行時常數池 欄位和方法資料 以及方法和構造方法的 都在非堆記憶體中...

Cache control引數說明

header中的cache control引數說明 php編碼 網頁的快取是由http訊息頭中的 cache control 來控制的,常見的取值有private no cache max age must revalidate等,預設為private。其作用根據不同的重新瀏覽方式分為以下幾種情況 ...