Gradle/SpringBoot/Kotlin协同程序项目中的内存不足错误

f2uvfpb9  于 2023-01-21  发布在  Spring
关注(0)|答案(1)|浏览(220)

这些天来,我向我的项目添加了一个代码包,Gradle构建在Github操作中失败,一些测试在运行Gradle测试任务时抛出OOM错误。
项目技术堆栈为Spring Boot 3/R2dbc + Kotlin 1.8/Kotlin协同程序+Java 17(Gradle Java语言级别设置为17)
生成工具堆栈。

  • 本地系统:Windows 10专业版(配备16G内存)/Oracle JDK 17/Gradle 7.6(项目Gradle Package 器)
  • Github操作:带有16G内存的自定义Ubuntu/Amazon JDK 17

经过研究,我们使用了一个具有16G内存的自定义更大的runner,并将Gradle JVM堆大小增加到8G,但没有任何帮助。

org.gradle.jvmargs=-Xmx8g -Xms4g

我们在运行测试时仍然会得到以下错误。但是测试代码本身不是问题,它们已经在我的本地机器上传递了。

*** java.lang.instrument ASSERTION FAILED ***: "!errorOutstanding" with message can't create name string at src/java.instrument/share/native/libinstrument/JPLISAgent.c line: 827

Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "ClassGraph-worker-439"

Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "ClassGraph-worker-438"

Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "boundedElastic-evictor-1"

Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "ClassGraph-worker-435"
*** java.lang.instrument ASSERTION FAILED ***: "!errorOutstanding" with message can't create name string at src/java.instrument/share/native/libinstrument/JPLISAgent.c line: 827

Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "ClassGraph-worker-433"

Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "ClassGraph-worker-436"

Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "ClassGraph-worker-432"
djp7away

djp7away1#

该错误似乎发生在Gradle工作进程中。Gradle执行单独的JVM进程来运行测试,这些进程的内存设置与Gradle主进程. This by default uses 512mb不同。
您可以执行不同的操作来解决此问题:增加该工作进程的堆,或者减少每个工作进程中执行的测试数量。可以通过两种方式减少测试数量:或者为每个模块分叉多个并行进程,或者为每个新进程分叉固定数量的测试。
请看一下Gradle testing documentation for more details中的这些选项。你可以用下面的代码控制所有这些设置(我不建议同时应用所有这些设置,这只是为了说明这些选项)。

tasks.withType<Test>().configureEach {
    maxHeapSize = "1g"
    forkEvery = 100
    maxParallelForks = 4
}

在任何情况下,我的建议都是对构建进行概要分析,以准确地找出哪些进程耗尽了内存,什么是最合适的内存设置,并可能确定产生这种情况的泄漏在哪里。

相关问题