天天看點

修改android最小堆記憶體

在oncreate的時候加入如下代碼段即可保證該運作程式有足夠的記憶體了:

int cwj_heap_size = 10 * 1024 * 1024;  //10m的記憶體  

vmruntime.getruntime().setminimumheapsize(cwj_heap_size);  

别忘了導入包:

import dalvik.system.vmruntime;  

深層了解,進入andorid源碼内部:

當應用程式配置設定記憶體時,會調用到dalvik/vm/alloc/heapsource.c中的 dvmtrackexternalallocation()方法,繼而調用到externalallocpossible()方法,該方法要求目前堆已使 用的大小(由currentheapsize和hs->externalbytesallocated構成)加上我們需要再次配置設定的記憶體大小不能超 過堆的最大記憶體值,如果超過就會報錯。

有兩個地方決定了一個堆的最大記憶體: 

1)dalvik/vm/init.c中的 

gdvm.heapsizemax = 16 * 1024 * 1024;    // spec says 75% physical mem 

2)frameworks/base/core/jni/androidruntime.cpp中的 

property_get("dalvik.vm.heapsize", heapsizeoptsbuf+4, "16m"); 

是以解決辦法就是将預設的16m改大一點。

1. 修改dalvik/vm/init.c:

static void setcommandlinedefaults()  

      * todo: base these on a system or application-specific default  

      */  

     gdvm.heapsizestart = 2 * 1024 * 1024; // spec says 16mb; too big for us.  

- gdvm.heapsizemax = 16 * 1024 * 1024; // spec says 75% physical mem  

+ gdvm.heapsizemax = 32 * 1024 * 1024; // spec says 75% physical mem  

     gdvm.stacksize = kdefaultstacksize;  

2. 修改frameworks/base/core/jni/androidruntime.cpp:

int androidruntime::startvm(javavm** pjavavm, jnienv** penv)  

     //options[curopt++].optionstring = "-verbose:class";  

     strcpy(heapsizeoptsbuf, "-xmx");  

- property_get("dalvik.vm.heapsize", heapsizeoptsbuf+4, "16m");  

+ property_get("dalvik.vm.heapsize", heapsizeoptsbuf+4, "32m");  

     //logi("heap size: %s", heapsizeoptsbuf);  

     opt.optionstring = heapsizeoptsbuf;  

     moptions.add(opt);  

繼續閱讀