修改android最小堆内存

在oncreate的时候加入如下代码段即可保证该运行程序有足够的内存了:

  1. int CWJ_HEAP_SIZE = 10 * 1024 * 1024;  //10M的内存  
  2. VMRuntime.getRuntime().setMinimumHeapSize(CWJ_HEAP_SIZE);  


别忘了导入包:

  1. 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:

  1. static void setCommandLineDefaults()  
  2.       * TODO: base these on a system or application-specific default  
  3.       */  
  4.      gDvm.heapSizeStart = 2 * 1024 * 1024; // Spec says 16MB; too big for us.  
  5.   
  6. - gDvm.heapSizeMax = 16 * 1024 * 1024; // Spec says 75% physical mem  
  7.   
  8. + gDvm.heapSizeMax = 32 * 1024 * 1024; // Spec says 75% physical mem  
  9.   
  10.      gDvm.stackSize = kDefaultStackSize;  


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

  1. int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv)  
  2.      //options[curOpt++].optionString = "-verbose:class";  
  3.   
  4.    
  5.      strcpy(heapsizeOptsBuf, "-Xmx");  
  6. - property_get("dalvik.vm.heapsize", heapsizeOptsBuf+4, "16m");  
  7. + property_get("dalvik.vm.heapsize", heapsizeOptsBuf+4, "32m");  
  8.      //LOGI("Heap size: %s", heapsizeOptsBuf);  
  9.   
  10.      opt.optionString = heapsizeOptsBuf;  
  11.      mOptions.add(opt);  
  12.   
上一篇:【高并发】面试官:Java中提供了synchronized,为什么还要提供Lock呢?


下一篇:More is better(MST)(求无向图中最大集合元素个数)