由于 JVM 堆 space 已耗尽,守护进程即将到期

Expiring Daemon because JVM heap space is exhausted

我刚刚将 Android Studio 更新到 3.5 Beta 1,我正在

Expiring Daemon because JVM heap space is exhausted

构建 运行 时的消息。此外,构建需要更多时间才能完成。有人对此有任何想法吗?

这可以通过增加为项目配置的最大堆大小来解决。

通过IDE:

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

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

通过 GUI:

在设置中,搜索 'Memory Settings' 并增加 IDE 最大堆大小 守护程序最大堆大小 根据系统 RAM 可用性。

(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.
...

我能够通过配置以下内容为我的 React Native 项目解决这个问题:

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

// app/build.gradle
android {
    dexOptions {
       javaMaxHeapSize "3g"
    }
}

The solution is to increase Android build memory.

随着您向应用程序添加更多模块,对 Android 构建系统的需求越来越大,默认内存设置将不起作用。为避免 OutOfMemoryErrors 在 Android 构建期间,您应该取消注释 /android/gradle.properties[=57 中存在的替代 gradle 内存设置=]:

org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8

您可以在 android 文件夹中找到 gradle.properties。

P.S.

What we are doing this and why it helps?

让我澄清一些基本术语以理解整个事情。

守护进程 : - 守护进程是一种计算机程序,运行作为后台进程,而不是在交互式用户的直接控制下。

Android Studio 2.1 启用了一项新功能:Dex In Process,可以显着提高完全清理的速度构建并提高 Instant 运行 性能。

要利用 Dex In Process,您需要修改 gradle.properties 文件并增加分配给 的内存量Gradle Daemon VM 1 Gb,最小 2 Gb,使用 org.gradle.jvmargs 属性:

指定用于守护进程的 JVM 参数。 该设置对于调整内存设置特别有用。

org.gradle.jvmargs=-Xmx2048m

默认值:

-Xmx10248m -XX:MaxPermSize=256m

默认 Gradle Daemon VM 内存分配为 1 GB — 这不足以支持 dexInProcess,因此要利用它,您需要将其设置为 at至少 2 GB。

Dex in process 的工作原理是允许多个 DEX 进程在单个 VM 中 运行,该 VM 也与 Gradle 共享,这就是为什么您需要在启用它之前分配额外的内存 —该内存将在 Gradle 和多个 DEX 进程之间共享。

如果您已将模块级 build.gradle 文件中的 javaMaxHeapSize 增加到超过默认的 1 GB,则需要相应地增加分配给 Gradle 守护进程的内存。

当有足够的内存分配时,进程中的 Dex 默认启用,提高整体构建性能并消除启动多个并行 VM 实例的开销。结果是所有构建时间都有显着改进,包括即时构建 运行、增量构建和完整构建。

来源: https://medium.com/google-developers/faster-android-studio-builds-with-dex-in-process-5988ed8aa37e

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

就我而言,这可能是某种 gradle 错误。我们实际上没有内存问题,但消息不断出现。我的解决方案是:

gradlew --no-daemon

使用 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

有用的链接:

https://proandroiddev.com/how-we-reduced-our-gradle-build-times-by-over-80-51f2b6d6b05b

https://developer.android.com/studio/build/profile-your-build#using-the-gradle---profile-option