问题描述

引起原因

由于某些原因导致垃圾回收器,每次花费了大量的时间(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"
        }
}

参考链接

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐