閱讀239 返回首頁    go 京東網上商城


修改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.   

最後更新:2017-04-03 08:26:24

  上一篇:go android任務棧
  下一篇:go 解決os x下gdb不能調試的問題