由于JVM堆空间不足,守护程序即将过期

172

我刚刚将 Android Studio 升级到 3.5 Beta 1 版本,但在构建运行时出现以下信息:

由于 JVM 堆空间耗尽而终止守护程序

此外,构建所需的时间也更长了。请问有人知道这是什么原因吗?


3
如果有帮助的话,请点击此处查看:https://dev59.com/66bja4cB1Zd3GeqPjaJx - Juraj Martinka
2
@JurajMartinka 是的,你说得对。在增加 IDE 最大堆大小 后,问题得到了解决。因此,在最新的 Android Studio 3.5 中引入了一个名为 Memory Settings 的新选项。这一切都是为了修复 Android Studio 中的内存泄漏问题。 - Rishabh Sagar
8个回答

183

通过增加项目配置的最大堆大小来解决此问题。

通过IDE:

将以下行添加到gradle.properties文件中。下面的内存大小(1)可以根据可用RAM进行配置。

org.gradle.daemon=true
org.gradle.jvmargs=-Xmx2560m

通过 GUI:

在设置中搜索“内存设置”,根据系统的 RAM 可用性增加 IDE 最大堆大小Daemon 最大堆大小

Memory Settings in Android Studio

(1)

$ man java
...
-Xmxsize
    Specifies the maximum size (in bytes) of the memory allocation pool in bytes. This value
    must be a multiple of 1024 and greater than 2 MB. Append the letter k or K to indicate
    kilobytes, m or M to indicate megabytes, g or G to indicate gigabytes. The default value
    is chosen at runtime based on system configuration. For server deployments, -Xms and
    -Xmx are often set to the same value. See the section "Ergonomics" in Java SE HotSpot
    Virtual Machine Garbage Collection Tuning Guide at
    http://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/index.html.

    The following examples show how to set the maximum allowed size of allocated memory to
    80 MB using various units:

        -Xmx83886080
        -Xmx81920k
        -Xmx80m

    The -Xmx option is equivalent to -XX:MaxHeapSize.
...

3
顺便提一下,org.gradle.daemon默认为true,因此不需要那行代码。 - Smalls
对我来说完美地工作了。默认情况下,Gradle/Kotlin守护进程没有任何值,我的IDE最大堆大小为2560级。谢谢! - Cam Tullos

166

我能够通过以下配置解决我的 React Native 项目问题:

1. gradle.properties

org.gradle.daemon=true
org.gradle.configureondemand=true
org.gradle.jvmargs=-Xmx4g -XX:MaxPermSize=2048m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8

2. 应用程序/build.gradle

android {
    dexOptions {
       javaMaxHeapSize "3g"
    }
}

5
当我添加这段代码时,react-native-vector-icons无法正常工作。 - Amir Gorji
运行 react-native link,重新安装,react-native-vector-icons 就会再次正常工作。 - romin21

54
解决方案是增加Android构建内存。随着您向应用程序添加更多模块,对Android构建系统的需求变得非常大,默认的内存设置将无法正常工作。为了避免Android构建期间发生OutOfMemoryErrors错误,应取消注释/android/gradle.properties中存在的备用gradle内存设置。{{/android/gradle.properties}}。
org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8

你可以在android文件夹内找到gradle.properties。
附言:

我们为什么这样做以及它如何帮助?

让我解释一些基本术语,以理解整个过程。 守护进程(Daemon):是一种计算机程序,以后台进程的形式运行,而不是在交互式用户的直接控制下。 Android Studio 2.1 启用了一个新功能:Dex In Process,它可以极大地提高全面清除构建的速度,同时改善即时运行性能。
要利用Dex In Process,您需要修改gradle.properties文件,并通过org.gradle.jvmargs属性将分配给Gradle Daemon VM的内存增加1 Gb,最小值为2 Gb:
指定守护进程进程使用的JVM参数。 该设置对于调整内存设置非常有用。
org.gradle.jvmargs=-Xmx2048m

默认值:

-Xmx10248m -XX:MaxPermSize=256m

默认的Gradle Daemon VM内存分配是1GB,这是不足以支持dexInProcess的,所以要想利用它,您需要将其设置为至少2GB。Dex in process通过允许多个DEX进程在一个与Gradle共享的单个VM中运行来工作,这就是为什么在启用它之前需要分配额外的内存的原因 - 该内存将在Gradle和多个DEX进程之间共享。如果您已经将module-level build.gradle文件中的javaMaxHeapSize增加到默认值1GB以上,则需要相应地增加分配给Gradle Daemon的内存。当分配足够的内存时,默认情况下启用Dex in Process,从而提高了整体构建性能并消除了启动多个并行VM实例的开销。结果是所有构建时间的显着改善,包括Instant Run、增量和完整构建。来源: https://medium.com/google-developers/faster-android-studio-builds-with-dex-in-process-5988ed8aa37e

https://rnfirebase.io/#increasing-android-build-memory


2
你能解释一下这段代码在做什么以及为什么有帮助吗? - Alex
2
请使用DEX进程加速Android Studio编译。这篇文章可以帮你了解更多细节:https://medium.com/google-developers/faster-android-studio-builds-with-dex-in-process-5988ed8aa37e - Rishabh Sagar
1
你好 @KailashUniyal,如果我在Android Studio的GUI中将堆大小设置为2048,但仍然出现“Expiring Daemon because JVM heap space is exhausted”的情况,该怎么办? - abdi
1
@abdi 请尝试将以下内容放入gradle.properties:org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 如果仍然无法解决问题,抱歉我不知道如何修复。 - Kailash Uniyal
1
android/gradle.properties中取消注释org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8,效果非常好。谢谢!@KailashUniyal - Vikas Bansal
显示剩余3条评论

3

使用gradle选项平衡内存消耗和构建速度。例如:

Android Studio 2022.1.1(PC RAM 16GB)

Gradle v7.3.3(./gradle/wrapper/gradle-wrapper.properties)

AGP v7.2.0(./build.gradle)

com.android.tools.build:gradle:7.2.0

缓存修复 Gradle 插件

org.gradle.android.cache-fix:org.gradle.android.cache-fix.gradle.plugin:2.5.3

这个Google服务依赖版本支持Gradle配置缓存

com.google.gms:google-services:4.3.5

./gradle.properties

android.enableJetifier=true
android.jetifier.ignorelist=bcprov-jdk15on
android.useAndroidX=true
kapt.incremental.apt=true
kapt.use.worker.api=true
kotlin.daemon.jvm.options=-Xms1g -Xmx4g
manifestmerger.enabled=true
org.gradle.caching=true
org.gradle.configureondemand=true
org.gradle.daemon=true
org.gradle.jvmargs=-XX:InitialHeapSize=1g -XX:MaxHeapSize=6g -XX:MaxPermSize=2g -XX:MaxMetaspaceSize=2g -XX:NewSize=1g -XX:MaxNewSize=2g -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
org.gradle.parallel=true
org.gradle.unsafe.configuration-cache=true
org.gradle.unsafe.configuration-cache-problems=warn

有用的链接:

如何将Gradle构建时间缩短超过80%

使用Gradle Profile选项对您的构建进行性能分析


1
在我的情况下,可能是某种 gradle 错误。我们实际上没有内存问题,但是这个消息一直出现。我的解决办法是:gradlew --no-daemon

0
我发现了一个名为org.gradle.launcher.daemon.bootstrap.GradleDaemon someVersion的守护进程。
在杀掉该进程并点击重新加载所有Gradle项目后,它将成功构建。

0
如果您在Jenkins中遇到此错误,以下是我解决问题的方法。
  1. 转到仪表板 > 配置。
  2. 在全局属性下添加以下参数。您可以根据需要设置内存值。这里我设置为2048m

名称:

GRADLE_OPTS

数值:

-Dorg.gradle.daemon=true -Dorg.gradle.jvmargs=-Xmx2048M 

enter image description here


0
将以下行添加到项目根目录中的gradle.properties文件中:
org.gradle.jvmargs=-Xmx4096m -Dfile.encoding=UTF-8

如果您的系统有更多可用的内存,您可以考虑增加此分配。例如,根据您可用的内存,您可以尝试使用-Xmx3072m-Xmx4096m来分别设置3GB或4GB。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接