簡體   English   中英

JVM幸存下來System.exit(1)

[英]JVM survives System.exit(1)

我目前正在使用system.exit(1)維護一個在發生故障時關閉的系統。 不幸的是,當發生這種情況時,系統的java進程仍然存在。

調用system.exit時jvm怎么可能沒有關閉?

那是因為System.exit(1)沒有關閉鈎子,使用System.exit(0);

實際上,根據以下代碼, System.exit(1)執行“停止和暫停”:

/* Invoked by Runtime.exit, which does all the security checks.
 * Also invoked by handlers for system-provided termination events,
 * which should pass a nonzero status code.
 */
static void exit(int status) {
boolean runMoreFinalizers = false;
synchronized (lock) {
    if (status != 0) runFinalizersOnExit = false;
    switch (state) {
    case RUNNING:   /* Initiate shutdown */
    state = HOOKS;
    break;
    case HOOKS:     /* Stall and halt */
    break;
    case FINALIZERS:
    if (status != 0) {
        /* Halt immediately on nonzero status */
        halt(status);
    } else {
        /* Compatibility with old behavior:
         * Run more finalizers and then halt
         */
        runMoreFinalizers = runFinalizersOnExit;
    }
    break;
    }
}
if (runMoreFinalizers) {
    runAllFinalizers();
    halt(status);
}
synchronized (Shutdown.class) {
    /* Synchronize on the class object, causing any other thread
         * that attempts to initiate shutdown to stall indefinitely
     */
    sequence();
    halt(status);
}
}

一種可能性是對System.exit(...)的調用拋出SecurityException

另請參閱https://stackoverflow.com/a/19823373/812093以獲取可能的解決方案。 這個想法基本上是在一個單獨的線程中而不是在主線程中觸發System.exit。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM