[英]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.