resolving java result 137

谁说我不能喝 提交于 2019-12-01 03:17:53
centic

Exit codes above 127 typically mean the process was stopped because of a Signal.

The exit code 137 then resolves to 128 + 9, whereas Signal 9 is SIGKILL, i.e. the process was forcefully killed. This can among others be a "kill -9 " command. However in your case this could be an out of memory condition on the operating system, which causes a functionality called "OOM Killer" to stop the process which is using up most of the memory in order to keep the OS itself stable even in such a condition.

See this question for a similar discussion.

Just in case someone is interested in knowing where this 128 number comes from; the reason can be found in the OpenJDK source code. See: UNIXProcess_md.c

From the comments in the Java_java_lang_UNIXProcess_waitForProcessExit method:

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.

So, that is the reason why the JVM developers decided to add 128 to the child's return status when the child exits because of a signal.

I leave here the method in charge of returning status from child process:

 /* 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;
     }
 }
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!