Android应用程序的默认最大内存值以及修改
当应用程序分配内存时,会调用到dalvik/vm/alloc/HeapSource.c中的 dvmTrackExternalAllocation()方法,继而调用到externalAllocPossible()方法,该方法要求当前堆已使 用的大小(由currentHeapSize和hs->externalBytesAllocated构成)加上我们需要再次分配的内存大小不能超 过堆的最大内存值,如果超过就会报错。
1)dalvik/vm/Init.cpp中的
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改大一点。
代码路径:
dalvik/vm/Init.cpp
frameworks/base/core/jni/AndroidRuntime.cpp
解决办法:
1、在Init.cpp文件中setCommandLineDefaults()方法中修改
static void setCommandLineDefaults()
{
const char* envStr = getenv("CLASSPATH");
if (envStr != NULL) {
gDvm.classPathStr = strdup(envStr);
} else {
gDvm.classPathStr = strdup(".");
}
envStr = getenv("BOOTCLASSPATH");
if (envStr != NULL) {
gDvm.bootClassPathStr = strdup(envStr);
} else {
gDvm.bootClassPathStr = strdup(".");
}
gDvm.properties = new std::vector<std::string>();
/* Defaults overridden by -Xms and -Xmx.
* TODO: base these on a system or application-specific default
*/
gDvm.heapStartingSize = 2 * 1024 * 1024; // Spec says 16MB; too big for us.
gDvm.heapMaximumSize = 32 * 1024 * 1024; // Spec says 75% physical mem
}
- 修改frameworks/base/core/jni/AndroidRuntime.cpp:
int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv)
{
strcpy(heapstartsizeOptsBuf, "-Xms");
property_get("dalvik.vm.heapstartsize", heapstartsizeOptsBuf+4, "4m");
opt.optionString = heapstartsizeOptsBuf;
mOptions.add(opt);
strcpy(heapsizeOptsBuf, "-Xmx");
property_get("dalvik.vm.heapsize", heapsizeOptsBuf+4, "32m");
opt.optionString = heapsizeOptsBuf;
mOptions.add(opt);
}