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