14

Amazon ec2 で Java プロセスを実行しています。72分間実行した後、突然「Java結果137」が表示されました。以上で、例外やその他のエラー メッセージは表示されません。このエラーを検索しましたが、役に立つものは見つかりませんでした。その原因と解決方法は何ですか?私にお知らせください。

4

2 に答える 2

33

通常、127 を超える終了コードは、Signalが原因でプロセスが停止したことを意味します。

その後、終了コード 137 は 128 + 9 に解決されますが、シグナル 9 は SIGKILL、つまりプロセスが強制的に強制終了されました。これは、特に「kill -9」コマンドである可能性があります。ただし、あなたの場合、これはオペレーティングシステムのメモリ不足の状態である可能性があります。これにより、「OOM Killer」と呼ばれる機能が、メモリの大部分を使用しているプロセスを停止して、そのような場合でも OS 自体を安定させます。調子。

同様の議論については、この質問を参照してください。

于 2012-09-05T11:31:02.467 に答える
6

誰かがこの 128 番号の由来を知りたい場合に備えて。その理由は、OpenJDK ソース コードで見つけることができます。参照: UNIXProcess_md.c

Java_java_lang_UNIXProcess_waitForProcessExit メソッドのコメントから:

返される最良の値は 0x80 + シグナル番号です。これは、すべての Unix シェルが行うことであり、呼び出し元がシグナルによってプロセスの終了とプロセスの終了を区別できるためです。

そのため、JVM 開発者は、子プロセスがシグナルによって終了したときに、子プロセスのリターン ステータスに 128 を追加することにしました。

子プロセスからステータスを返すメソッドをここに残します。

 /* Block until a child process exits and return its exit code.
    Note, can only be called once for any given pid. */
 JNIEXPORT jint JNICALL
 Java_java_lang_UNIXProcess_waitForProcessExit(JNIEnv* env,
                                               jobject junk,
                                               jint pid)
 {
     /* We used to use waitid() on Solaris, waitpid() on Linux, but
      * waitpid() is more standard, so use it on all POSIX platforms. */
     int status;
     /* Wait for the child process to exit.  This returns immediately if
        the child has already exited. */
     while (waitpid(pid, &status, 0) < 0) {
         switch (errno) {
         case ECHILD: return 0;
         case EINTR: break;
         default: return -1;
         }
     }

     if (WIFEXITED(status)) {
         /*
          * The child exited normally; get its exit code.
          */
         return WEXITSTATUS(status);
     } else if (WIFSIGNALED(status)) {
         /* The child exited because of a signal.
          * The best value to return is 0x80 + signal number,
          * because that is what all Unix shells do, and because
          * it allows callers to distinguish between process exit and
          * process death by signal.
          * Unfortunately, the historical behavior on Solaris is to return
          * the signal number, and we preserve this for compatibility. */
 #ifdef __solaris__
         return WTERMSIG(status);
 #else
         return 0x80 + WTERMSIG(status);
 #endif
     } else {
         /*
          * Unknown exit code; pass it through.
          */
         return status;
     }
 }
于 2014-06-25T09:15:18.930 に答える