2016-11-25 152 views
0

我有一臺服務器(Ubuntu 14.04.4 LTS),並且希望某個Java應用程序始終運行它。目前我使用nohup gradle run &開始它。昨天它停止工作。 nohup.out顯示以下錯誤消息:如何一直運行Java控制檯應用程序?

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):在OutOfMemoryError的情況下,我修改了Gradle代碼以記錄內存轉儲。

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] 
+4

137內存不足。你可能有內存泄漏 –

+0

你也可能在你的標題上工作 –

+0

你把它作爲一個簡單的「java應用程序」運行嗎?或者你運行在像tomcat這樣的服務器上?你在用詹金斯嗎? – RudiDudi

回答

1
  1. 基本上,這不是一個好習慣。您應該避免使用構建工具,並在運行之前將其打包到可執行JAR中。如果由於某種原因需要在啓動期間解析工件,請查看Capsule projectGradle Capsule Plugin

  2. Gradle 3. +默認使用守護進程。如果它閒置了3個小時或更久,Gradle會殺死守護進程。我不確定這是否是原因,但您可以嘗試從--no-daemon的參數開始。

+0

我創建了一個胖JAR,並在24小時前發佈了它。到現在爲止,應用程序沒有問題。所以你可能是對的。 –

0

正如評論說,這是一個內存溢出異常,你可以這樣做:

Rewiev你的代碼,也許你可以在你的代碼的低性能。

如果你正在運行一個簡單的「java應用程序」,你可以點擊「Run As .. Java Application」點擊「Run As .. Run Configration」,選擇你的java應用程序並在TAB「Arguments」,「VM參數」添加此參數:

-Xmx1024m -Xms512m 

這個參數,你在你的應用程序(在開始)和最大1024M的分配最小的512M。您可以根據需要放大這些數字。

+3

這不能解決內存泄漏! –

0

首先,您應該嘗試在應用程序中查找並解決內存不足問題。

要設置監控,您可以編寫一個簡單的腳本來檢查您的應用程序是否正在運行。 無論是檢查應用程序正在監聽指定端口或檢查使用

ps aux 

或適合你任何其他方式。

如果應用程序關閉,請重新啓動它。

現在設置一個每隔幾分鐘運行一次該腳本的cron。 類似於

*/10 * * * * /your/script 

這將每隔10分鐘運行腳本。

相關問題