在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);