AS gradle 編譯引起的bug

問題描述

引起原因

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

參考鏈接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章