因为 JVM 堆空间耗尽而到期的守护进程

我刚把 Android Studio 升级到3.5 Beta 1

因为 JVM 堆空间耗尽而到期的守护进程

消息,而生成正在运行。此外,构建需要更多的时间来完成。有人知道这件事吗?

134971 次浏览

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

通过 IDE:

将以下代码行添加到 gradle.properties 文件中

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

通过 GUI:

在设置中,搜索 “内存设置”并根据系统 RAM 的可用性增加 最大堆大小守护进程最大堆大小

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

我可以通过配置以下内容来解决 本土反应项目的这个问题:

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. app/build.gradle

android {
dexOptions {
javaMaxHeapSize "3g"
}
}

解决方案是增加 Android 构建内存。

当你向你的应用程序添加更多模块时,Android 构建系统会有一个难以置信的需求,而默认的内存设置将无法工作。为了在 Android 构建期间避免使用 输出记忆错误,您应该取消注释 /android/gradle.properties中的备用级别内存设置:

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

您可以在 机器人文件夹中找到 gradle.properties。

附言。

我们在做什么,为什么它有帮助?

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

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

Android Studio 2.1 启用了一个新特性: 正在处理中的 Dex,它可以极大地提高完全干净构建的速度,同时提高 Instant Run 的性能。

为了利用 正在处理中的 Dex,您需要修改 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 共享,这就是为什么你需要在启用它之前分配额外的内存ーー这些内存将在 Gradle 和多个 DEX 进程之间共享。

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

默认情况下,如果在 Process 中分配的内存足够多,就会启用 Dex,从而提高总体构建性能并删除 启动多个并行 VM 实例的开销。其结果是在所有构建时都有显著的改进,包括即时运行、增量构建和完整构建。

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

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

对我来说,可能是某种爬虫。我们实际上没有记忆问题,但信息不断出现。我的解决办法是:

gradlew --no-daemon

使用分级选项平衡内存消耗和构建速度

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

缓存修复级别插件

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

这个谷歌服务依赖版本支持级别配置缓存

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