文章目錄
當應用程式分配記憶體時,會調用到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);
|