與dalvik GC相關的屬性詳解

    在dalvik中,GC的類型有三種:

1、GC_EXPLICIT:

    應用主動調用System.gc()產生的GC事件。

2、GC_FOR_ALLOC:

    內存分配時,發現可用內存不夠時觸發的GC事件。

3、GC_CONCURRENT:

    給java層的class分配內存後,計算已分配的大小達到閾值(當前DVM heap size小一點)時會觸發的GC事件。

因爲第2和第3中GC是由系統觸發的,所以應用是無法減少這兩種類型的GC事件。但需要減少這兩種GC事件是,可以通過配置dalvik的系統屬性或者修改dalvik的GC算法來實現,本文只對修改dalvik的系統屬性的方式進行介紹。

    

dalvik與GC相關的屬性有:

dalvik.vm.heapstartsize:初始化dalvik分配的內存大小。

dalvik.vm.heapgrowthlimit:沒有在mainfest中設置android:largeheap="true"時,應用的最大內存,超過這個值會有                                          OOM產生。

dalvik.vm.heapsize:在mainfest中設置android:largeheap="true"時,應用的最大內存,超過這個值會有                                          OOM產生。

dalvik.vm.heaputilization、dalvik.vm.heapminfree 、dalvik.vm.heapmaxfree:dalvik GC時使用的參數。

dalvim GC策略是:

1.在一次GC後,根據當前Heap中已分配的內存大小除以dalvik.vm.heaputilization(0.75),得到一個目標值。

2.如果目標值不在(已分配的值+dalvik.vm.heapminfree)到(已分配的值+dalvik.vm.heapmaxfree)這個區間,即取區間邊界值做爲目標值(運行一段時間後第1步得到的目標值肯定會超過這個範圍)。

3.虛擬機記錄這個目標值,當做當前允許總的可以分配到的內存。同時根據目標值減去固定值(200~500K),當做觸發GC_CONCURRENT事件的閾值。

4.當下一次分配內存,分配成功時。重新計算已分配的內存大小;若有達到GC_CONCURRENT的閾值,則產生GC。

5.當下一次分配內存,開始分配失敗時。則會產生GC_FOR_ALLOC事件,釋放內存;然後再嘗試分配。

可以通過調整dalvik.vm.heapminfree 和dalvik.vm.heapmaxfree屬性的值,減少GC_FOR_ALLOC和GC_CONCURRENT的次數,如果這兩個值設置的過大,則會導致一次GC的時間過長,從而會看到明顯的卡頓現象,設置的值既要使GC的次數減少,也不能是一次GC的時間過長。


     在有的平臺上,可以通過代碼對單個應用的dalvik的屬性進行設置,以減少對全局設置對系統的影響,可以再App裏面通過如下的方式對當前的App的dalvik屬性設置:

import dalvik.system.VMRuntime;
import android.os.SystemProperties;
...
VMRuntime.getRuntime().setTargetHeapUtilization(0.75f);
VMRuntime.getRuntime().setTargetHeapMinFree(2*1024*1024);
VMRuntime.getRuntime().setTargetHeapConcurrentStart(8*1024*1024);

...

如果想通過系統進行控制,也可以在framework裏面的ActivityThread的handleBindApplication函數裏面進行設置:

import dalvik.system.VMRuntime;
import android.os.SystemProperties;
import java.lang.*;
...
if( data.processName.equals("com.android.launcher")) {
VMRuntime.getRuntime().setTargetHeapUtilization(0.75f);
    VMRuntime.getRuntime().setTargetHeapMinFree(2*1024*1024);
    VMRuntime.getRuntime().setTargetHeapConcurrentStart(8*1024*1024);
}

...








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