問題描述
引起原因
由於某些原因導致垃圾回收器,每次花費了大量的時間(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"
}
}