Warum sterben meine Gradle-Builds mit Exit-Code 137?

Lesezeit: 10 Minuten

Ich habe versucht, ein großes Projekt zu kompilieren und zu testen, um Gradle zu verwenden. Der Test läuft gut, bis sie unerwartet sterben. Ich habe herumgegraben und Ressourcen sagten, dass dies auf ein Speicherproblem zurückzuführen ist. Wenn ich die Anzahl der Tests in der Suite reduziere, läuft sie einwandfrei.

Ich habe den Speicher um das 4-fache erhöht und die Debugging-Stufe erhöht, aber ich verstehe immer noch nicht, was dies verursacht. Hier ist der schrecklich kryptische Stacktrace. Die letzte Zeile (nach rechts scrollen) zeigt die Speichereinstellungen, die ich definiert habe.

...
...
...

1125 tests completed, 30 failed, 9 skipped
:test FAILED
:test (Thread[Daemon worker,5,main]) completed. Took 8 mins 39.684 secs.

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':test'.
> Process 'Gradle Test Executor 1' finished with non-zero exit value 137

* Try:
Run with --debug option to get more log output.

* Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':test'.
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:69)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:46)
    at org.gradle.api.internal.tasks.execution.PostExecutionAnalysisTaskExecuter.execute(PostExecutionAnalysisTaskExecuter.java:35)
    at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:64)
    at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:58)
    at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:52)
    at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:52)
    at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:53)
    at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43)
    at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:203)
    at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:185)
    at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.processTask(AbstractTaskPlanExecutor.java:66)
    at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.run(AbstractTaskPlanExecutor.java:50)
    at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor.process(DefaultTaskPlanExecutor.java:25)
    at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter.execute(DefaultTaskGraphExecuter.java:110)
    at org.gradle.execution.SelectedTaskExecutionAction.execute(SelectedTaskExecutionAction.java:37)
    at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:37)
    at org.gradle.execution.DefaultBuildExecuter.access$000(DefaultBuildExecuter.java:23)
    at org.gradle.execution.DefaultBuildExecuter$1.proceed(DefaultBuildExecuter.java:43)
    at org.gradle.execution.DryRunBuildExecutionAction.execute(DryRunBuildExecutionAction.java:32)
    at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:37)
    at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:30)
    at org.gradle.initialization.DefaultGradleLauncher$4.run(DefaultGradleLauncher.java:154)
    at org.gradle.internal.Factories$1.create(Factories.java:22)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:52)
    at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:151)
    at org.gradle.initialization.DefaultGradleLauncher.access$200(DefaultGradleLauncher.java:32)
    at org.gradle.initialization.DefaultGradleLauncher$1.create(DefaultGradleLauncher.java:99)
    at org.gradle.initialization.DefaultGradleLauncher$1.create(DefaultGradleLauncher.java:93)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:62)
    at org.gradle.initialization.DefaultGradleLauncher.doBuild(DefaultGradleLauncher.java:93)
    at org.gradle.initialization.DefaultGradleLauncher.run(DefaultGradleLauncher.java:82)
    at org.gradle.launcher.exec.InProcessBuildActionExecuter$DefaultBuildController.run(InProcessBuildActionExecuter.java:94)
    at org.gradle.tooling.internal.provider.ExecuteBuildActionRunner.run(ExecuteBuildActionRunner.java:28)
    at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
    at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:43)
    at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:28)
    at org.gradle.launcher.exec.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:78)
    at org.gradle.launcher.exec.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:48)
    at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:52)
    at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
    at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:37)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
    at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:26)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
    at org.gradle.launcher.daemon.server.exec.RequestStopIfSingleUsedDaemon.execute(RequestStopIfSingleUsedDaemon.java:34)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
    at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:74)
    at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:72)
    at org.gradle.util.Swapper.swap(Swapper.java:38)
    at org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:72)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
    at org.gradle.launcher.daemon.server.health.DaemonHealthTracker.execute(DaemonHealthTracker.java:40)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
    at org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:66)
    at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
    at org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:72)
    at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
    at org.gradle.launcher.daemon.server.health.HintGCAfterBuild.execute(HintGCAfterBuild.java:41)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
    at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:50)

BUILD FAILED    at org.gradle.launcher.daemon.server.DaemonStateCoordinator$1.run(DaemonStateCoordinator.java:246)

    at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:54)
    at org.gradle.internal.concurrent.StoppableExecutorImpl$1.run(StoppableExecutorImpl.java:40)

Caused by: org.gradle.process.internal.ExecException: Process 'Gradle Test Executor 1' finished with non-zero exit value 137
Total time: 9 mins 38.624 secs
    at org.gradle.process.internal.DefaultExecHandle$ExecResultImpl.assertNormalExitValue(DefaultExecHandle.java:367)
    at org.gradle.process.internal.DefaultWorkerProcess.waitForStop(DefaultWorkerProcess.java:161)
    at org.gradle.api.internal.tasks.testing.worker.ForkingTestClassProcessor.stop(ForkingTestClassProcessor.java:86)
    at org.gradle.api.internal.tasks.testing.processors.RestartEveryNTestClassProcessor.endBatch(RestartEveryNTestClassProcessor.java:60)
    at org.gradle.api.internal.tasks.testing.processors.RestartEveryNTestClassProcessor.stop(RestartEveryNTestClassProcessor.java:54)
    at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
    at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
    at org.gradle.messaging.dispatch.FailureHandlingDispatch.dispatch(FailureHandlingDispatch.java:29)
    at org.gradle.messaging.dispatch.AsyncDispatch.dispatchMessages(AsyncDispatch.java:132)
    at org.gradle.messaging.dispatch.AsyncDispatch.access$000(AsyncDispatch.java:33)
    at org.gradle.messaging.dispatch.AsyncDispatch$1.run(AsyncDispatch.java:72)
    ... 2 more

Stopped 0 compiler daemon(s).
Received result Failure[value=org.gradle.initialization.ReportedException: org.gradle.internal.exceptions.LocationAwareException: Execution failed for task ':test'.] from daemon DaemonInfo{pid=48, address=[65adcc0f-8881-4511-b7a0-1b88c7016510 port:34390, addresses:[/0:0:0:0:0:0:0:1%lo, /127.0.0.1]], idle=false, context=DefaultDaemonContext[uid=14546872-57d6-4da6-8358-dc41cb7bb01d,javaHome=/usr/lib/jvm/java-8-oracle,daemonRegistryDir=/srv/myapplication/.gradle/daemon,pid=48,idleTimeout=120000,daemonOpts=-XX:MaxMetaspaceSize=320m,-XX:+DisableExplicitGC,-XX:+UseConcMarkSweepGC,-XX:NewSize=124m,-XX:SurvivorRatio=16,-Xms257m,-Xmx2049m,-Dfile.encoding=UTF-8,-Duser.country=US,-Duser.language=en,-Duser.variant]} (build should be done).

Benutzer-Avatar
Mridang Agarwalla

Dieses Problem scheint eher mit Linux als mit Gradle zusammenzuhängen, wie in den Jenkins-Dokumenten angegeben:

In Fällen, in denen der virtuelle Speicher knapp wird, kann der OOM-Killer (Out of Memory) des Kernels Jenkins oder einzelne Builds zwangsweise beenden. Wenn dies unter Linux auftritt, sehen Sie möglicherweise, dass Builds mit dem Exit-Code 137 (128 + Signalnummer für SIGKILL) beendet werden. Das dmesg Die Befehlsausgabe zeigt Protokollmeldungen, die die vom Kernel durchgeführte Aktion bestätigen.

https://wiki.jenkins-ci.org/display/JENKINS/Ich+bekomme+OutOfMemoryError

  • Ich denke, das ist nicht so nützlich, es würde so aussehen, als gäbe es unten eine andere Antwort, die nützlicher ist. Dies ist kein Problem, das nur für Jenkins gilt. Es gilt auch für jedes CI.

    – José Antonio Jiménez Saez

    10. Februar 2021 um 16:29 Uhr

  • OOM-Kill ist bei einigen Linux-Distributionen standardmäßig deaktiviert, darunter Ubuntu.

    – Coder Guy

    6. August 2021 um 22:24 Uhr


Ich hatte ein ähnliches Problem auf dem Server von DigitalOcean, mein Gradle-Build ist vollständig fehlgeschlagen test Stufe mit sehr ähnlichem Stacktrace und ohne dass ein einziger Test ausgeführt wird.

In der Gradle-Dokumentation wird angegeben, dass der Gradle-Daemon sollte nicht in CI-Umgebungen ausgeführt werden. Also habe ich einfach hinzugefügt --no-daemon zu meinem Build-Befehl und alles funktionierte gut und gut. Stoppt auch den Daemon mit ./gradlew --stop war nützlich, aber es funktionierte nur bei einem einzigen Build – der nächste schlug ebenfalls fehl.

Mein Build-Befehl:

./gradlew build --no-daemon

  • Wie aus der akzeptierten Antwort in diesem Thread hervorgeht stackoverflow.com/questions/44786375/… benötigen Sie möglicherweise auch einen weiteren Parameter; –no-daemon –max-workers 2

    – Petrus

    18. Januar 2018 um 11:10 Uhr

  • Ab 6.6.1 wird die Verwendung von Daemon in CI empfohlen docs.gradle.org/6.6.1/userguide/…

    – Jersub

    14. September 2020 um 11:21 Uhr

  • @jersub Danke für das Update! Ich denke, dass mein Kommentar immer noch relevant ist, da die Originaldokumentation besagt: „Wenn Sie jedoch vermuten, dass Daemon Ihre CI-Builds instabil macht, können Sie es deaktivieren, um für jeden Build eine neue Laufzeit zu verwenden, da die Laufzeit vollständig von allen vorherigen isoliert ist baut.”

    – Roman Golyschew

    15. September 2020 um 15:53 ​​Uhr


Ich hatte das gleiche Problem, aber in einer CI-Umgebung, in der Builds gestartet werden Docker Container. In diesem speziellen Fall weiß die JVM nicht, wie viel Speicher sie verwenden kann, und Sie können diese Art von Problemen erleben.

Um der JVM mitzuteilen, wie viel Speicher verfügbar ist, können Sie verwenden

gradle build -Dorg.gradle.jvmargs=-XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap

und stellen Sie es auch auf Ihre Testaufgaben ein:

test {
  jvmArgs "-XX:+UnlockExperimentalVMOptions", "-XX:+UseCGroupMemoryLimitForHeap"
}

Dies ist eine neue JVM-Funktion, die in 8u131+ eingeführt wurde

sehen: http://royvanrijn.com/blog/2018/05/java-and-docker-memory-limits/

  • Das einfache Hinzufügen der Test-jvm-Argumente zu meinem Gradle funktionierte für mich in CircleCi, musste den Befehl nicht ändern.

    – Brooks DuBois

    26. April 2019 um 19:38 Uhr

  • Ist für Java10 und neuer nicht relevant

    – fyrkow

    27. Juli 2020 um 12:40 Uhr

Benutzer-Avatar
Mike Rippon

Ich hatte auch das gleiche Problem mit CircleCI, aber ich hatte mit keinem der oben genannten Probleme Glück. Das habe ich gefunden:

  • Hinzufügen -Dorg.gradle.daemon=false zu meinem CircleCI config.yml hat die Verwendung des Daemons gestoppt, aber das Problem nicht behoben.
  • Hinzufügen -Dorg.gradle.workers.max=2 zu GRADLE_OPTSoder --max-workers 2 Der Gradle-Befehl schien, soweit ich sehen konnte, keine große Wirkung zu haben. Ich habe es versucht --max-workers=2 nur für den Fall, denn beide Formate scheinen bei Google herumzuschwirren. Ich habe mich mit meinem CircleCI-Container verbunden und rein top Ich konnte immer noch 3-4 Java-Prozesse abzweigen sehen, also bin ich mir nicht sicher, ob dies etwas bewirkt?
  • Ich habe auch Max Worker = 1 in den obigen Kombinationen ausprobiert.
  • Versucht -XX:+UnlockExperimentalVMOptions und -XX:+UseCGroupMemoryLimitForHeap in beiden JVM-Argumenten und in der test {} Konfiguration in meinem Build, wie von Baptiste Mesta vorgeschlagen. Ich sehe nicht, wie das funktionieren könnte; Ich hätte gedacht, dass die mehrfach gegabelten Prozesse nicht wissen, welchen Anteil des Containerspeichers die anderen Prozesse verbrauchen? Es sei denn, ich verstehe es nicht richtig.

Am Ende habe ich es einfach behoben, indem ich nett und explizit mit den Speichereinstellungen umgegangen bin, anstatt Magie zu verwenden:

  • Circle CI-Konfiguration: GRADLE_OPTS: -Xmx2048m -Dorg.gradle.daemon=false
  • Stufenaufbau: test { maxHeapSize = "512m" }

Bearbeiten: Möglicherweise müssen Sie niedriger gehen, je nachdem, ob andere Prozesse ausgeführt werden.

Ähnlich wie die Antwort von Baptiste Mesta, aber für JDK 11 habe ich die JVM-Option UseContainerSupport verwendet, um meinen Jenkins-Build zu lösen.

./gradlew test --no-daemon -Dorg.gradle.jvmargs=-XX:+UseContainerSupport

  • Ist nicht UseContainerSupport standardmäßig aktiviert?

    – fyrkow

    27. Juli 2020 um 12:43 Uhr

  • FWIW UseContainerSupport war erforderlich, damit dies bei mir funktioniert.

    – Reid Mac

    4. Oktober 2021 um 16:34 Uhr

Benutzer-Avatar
k6ps

Ich hatte ein ähnliches Problem mit Bamboo-Agenten (die auf Docker ausgeführt werden), auf denen Gradle 4.6 ausgeführt wird. Das test Aufgabe gerade abrupt beendet mit

    build   27-Dec-2018 22:00:20    22:00:20.018 [DEBUG] [org.gradle.process.internal.DefaultExecHandle] Process 'Gradle Test Executor 1' finished with exit value 137 (state: FAILED)

Wir haben über 3000 Unit-Tests. In unserem Fall wurde das Problem mit gelöst forkEvery um die Anzahl der pro Testausführungsprozess ausgeführten Testklassen zu begrenzen und auch die Speichernutzung zu begrenzen:

    test {
        maxHeapSize '512m'
        forkEvery 100
        jvmArgs '-Xmx512m', '-Xms512m'
    }

  • Ist nicht UseContainerSupport standardmäßig aktiviert?

    – fyrkow

    27. Juli 2020 um 12:43 Uhr

  • FWIW UseContainerSupport war erforderlich, damit dies bei mir funktioniert.

    – Reid Mac

    4. Oktober 2021 um 16:34 Uhr

Benutzer-Avatar
Zia

Dies ist eigentlich ein Speicherproblem. Im Allgemeinen hat der Docker-Container ein Speicherlimit von 4 GB. Sie müssen also darauf achten, dass Ihr Java-Heap diese Grenze nicht überschreitet. Es gibt nur wenige Lösungen dafür. Ich beziehe mich auf Android

  1. Fügen Sie dies zu gradle.properties hinzu (ändern Sie die Größe nach Bedarf)

    org.gradle.jvmargs=-Xmx10248m -XX:MaxPermSize=256m

  2. Fügen Sie dies zu Ihrem build.gradle hinzu

    android.testOptions.unitTests.all { maxHeapSize = "1024m" }

oder

android {
    testOptions {
        unitTests {
            // Any other configurations
            all {
                maxHeapSize = "1024m"
            }
        }
    }

Wenn Sie immer noch auf OOM-Probleme stoßen, können Sie auch die maximale Anzahl von Arbeitern für Gradle begrenzen: ./gradlew test --max-workers 4

Hoffe das hilft.

1215400cookie-checkWarum sterben meine Gradle-Builds mit Exit-Code 137?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy