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

2021-10-07 18:19:12 字數 2219 閱讀 1333

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

虛擬機器記憶體

xmx10240m 代表最大堆 xms10240m 代表最小堆 xmn5120m 代表新生代 xxsurvivorratio 3 代表eden survivor 3 根據generation collection演算法 目前大部分jvm採用的演算法 一般根據物件的生存週期將堆記憶體分為若干不同的區域...

Android虛擬機器引數說明

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

設定虛擬機器記憶體

記憶體 虛擬機器程序執行在記憶體裡,所以它對記憶體的讀寫操作不需要通過實際作業系統,而增加記憶體空間的操作肯定還需要實際作業系統。硬碟 虛擬機器程序不佔據硬碟 理論上不占用,但是如果實際作業系統使用了虛擬記憶體的話,還是會使用硬碟交換 只是虛擬機器硬碟在實際硬碟占用了空間,虛擬機器作業系統對虛擬機器...