您当前的位置: 首页 >  android

xiangzhihong8

暂无认证

  • 3浏览

    0关注

    1324博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

修改android最小堆内存

xiangzhihong8 发布时间:2014-06-05 08:59:32 ,浏览量:3

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

[java] view plain copy
  1. int CWJ_HEAP_SIZE = 10 * 1024 * 1024;  //10M的内存  
  2. VMRuntime.getRuntime().setMinimumHeapSize(CWJ_HEAP_SIZE);  

别忘了导入包:

[java] view plain copy
  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:

[plain] view plain copy
  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:

[plain] view plain copy
  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.   
关注
打赏
1482932726
查看更多评论
立即登录/注册

微信扫码登录

0.0430s