问题描述
引起原因
由于某些原因导致垃圾回收器,每次花费了大量的时间(by default 98% of all CPU time of the process),仅仅恢复了一点点内存(by default 2% of the heap),这个异常有效的提醒你,你的程序此时正停止了其他事情而仅仅忙于垃圾处理,为了防止你的应用榨干整个CPU而做不了其他事情,此时JVM虚拟机就会抛出这个异常
可能出现的场景
一些code在内存已经受限的环境,创建了大量临时对象、大量的weakly-referenced对象,
在安装目录下bin/studio64.exe.vmoptions,打开文件可以看到
-Xms256m
-Xmx1280m
-XX:MaxPermSize=350m
-XX:ReservedCodeCacheSize=240m
-XX:+UseConcMarkSweepGC
-XX:SoftRefLRUPolicyMSPerMB=50
-da
-Djna.nosys=true
-Djna.boot.library.path=
-Djna.debug_load=true
-Djna.debug_load.jna=true
-Dsun.io.useCanonCaches=false
-Djava.net.preferIPv4Stack=true
-Didea.paths.selector=AndroidStudio2.2
-Didea.platform.prefix=AndroidStudio
-Didea.jre.check=true
重点关注的参数是
- Xms:Jvm启动的起始堆内存,堆内存是分配各对象的内存
Xms specifies the initial memory allocation pool.
- Xmx: Jvm运行时可用最大的内存
Xmx specifies the maximum memory allocation pool for a Java Virtual Machine (JVM)
解决
- 方法一
在gradle.properties 中加入下面两行
org.gradle.jvmargs=-Xmx2048M
org.gradle.jvmargs=-Xmx2048m JVM最大允许分配的堆内存,按需分配
若继续报则需要加大
还有其他的配置选项如:
org.gradle.daemon=true 就是让你让你编译时使用守护进程。
org.gradle.parallel=true 使用并行编译
org.gradle.jvmargs=-Xmx2048m JVM最大允许分配的堆内存,按需分配
XX:MaxPermSize=512m JVM最大允许分配的非堆内存,按需分配
方法二
在app下的build.gradle中找到android,并添加如下配置:
android {
dexOptions {
javaMaxHeapSize "4g"
}
}
参考链接
- http://stackoverflow.com/questions/1393486/error-java-lang-outofmemoryerror-gc-overhead-limit-exceeded
- http://stackoverflow.com/questions/35034830/android-studio-gc-overhead-limit-exceeded