天天看点

修改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);  

继续阅读