【发布时间】:2016-11-25 11:09:31
【问题描述】:
我有一台服务器(Ubuntu 14.04.4 LTS),并希望某个 Java 应用程序一直在其上运行。目前我使用nohup gradle run & 启动它。昨天它停止工作了。 nohup.out 显示以下错误消息:
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':run'.
> Process 'command '/usr/lib/jvm/java-8-oracle/bin/java'' finished with non-zero exit value 137
我需要如何更改我的 Java 应用程序以防止将来出现此类错误(确保应用程序一直运行,并且 - 理想情况下 - 如果它崩溃了会自动重新启动)?我正在寻找简单、最少的解决方案。
请注意,我之前在这家特定公司的服务器上遇到过类似问题。我有一个带有 Web 应用程序的 Apache 服务器,有时它会无缘无故地停止工作(也许服务器由于活动不足而进入睡眠状态,不知道)。
更新 1(27.01.2017 12:30 MSK):我修改了 Gradle 代码以在 OutOfMemoryError 的情况下记录内存转储。
run {
jvmArgs = ["-Xmx100m", "-XX:+HeapDumpOnOutOfMemoryError", "-XX:HeapDumpPath=/home/dp/dev/myprod/log/memdump.log"]
}
当我运行 Gradle 脚本时,我在输出中看到以下消息,从中我得出结论,内存转储参数定义正确。
09:33:47.031 [INFO] [org.gradle.process.internal.DefaultExecHandle] Starting process 'command '/usr/lib/jvm/java-8-oracle/bin/java''. Working directory: /home/dp/dev/myprod Command: /usr/lib/jvm/java-8-oracle/bin/java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/dp/dev/myprod/log/memdump.log [...] com.mycompany.myprod.AppKt
应用程序崩溃后,我没有看到文件/home/dp/dev/myprod/log/memdump.log。目录/home/dp/dev/myprod/log/ 存在并且可供启动应用程序的用户访问。
我使用nohup gradle --full-stacktrace --stacktrace --debug run & 启动应用程序,但它无助于获取有关问题原因的任何有意义的信息。
这是我得到的例外:
06:29:16.179 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] Caused by: org.gradle.process.internal.ExecException: Process 'command '/usr/lib/jvm/java-8-oracle/bin/java'' finished with non-zero exit value 137
06:29:16.180 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] at org.gradle.process.internal.DefaultExecHandle$ExecResultImpl.assertNormalExitValue(DefaultExecHandle.java:369)
06:29:16.186 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] at org.gradle.process.internal.DefaultJavaExecAction.execute(DefaultJavaExecAction.java:31)
06:29:16.186 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] at org.gradle.api.tasks.JavaExec.exec(JavaExec.java:74)
06:29:16.186 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:75)
06:29:16.186 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.doExecute(DefaultTaskClassInfoStore.java:136)
06:29:16.187 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.execute(DefaultTaskClassInfoStore.java:129)
06:29:16.187 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.execute(DefaultTaskClassInfoStore.java:118)
06:29:16.187 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:623)
06:29:16.187 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:606)
06:29:16.187 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:80)
06:29:16.188 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:61)
06:29:16.194 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] ... 68 more
06:29:16.205 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]
【问题讨论】:
-
137 内存不足。你可能有内存泄漏
-
你也可以在你的标题上工作
-
你是把它作为一个简单的“java应用程序”运行还是在像tomcat这样的服务器上运行?你在用詹金斯吗?
-
@RudiDudi 简单的 Java(实际上是 Kotlin)应用程序。我既不使用 Tomcat,也不使用 Jenkins。
-
@PhilippSander 查看我的更新 1. 在没有内存转储的情况下如何诊断 OutOfMemoryError?
标签: java linux gradle ubuntu-14.04 daemon