Я пытаюсь понять, как точка доступа JVM обрабатывает сигналы завершения (например, SIGTERM
). Что я мог найти, так это то, что расположение сигнала SIGTERM
установлено в этой точке на UserHandler
, что выглядит (комментарии опущены):
static void UserHandler(int sig, void *siginfo, void *context) {
if (sig == SIGINT && Atomic::add(1, &sigint_count) > 1) {
return;
}
if (sig == SIGINT && VMError::is_error_reported()) {
os::die();
}
os::signal_notify(sig);
}
Таким образом, все, что он делает, это уведомляет Signal Dispatcher
и устанавливает номер принятого сигнала на static volatile jint pending_signals[NSIG+1]
.
Но в случае SIGTERM
фактическое exit(143)
делается в VM Thread
. Задача VM_Exit
с _exit_code = 143
каким-то образом доставляется в VM Thread
.
Вопрос: Можете ли вы дать подсказку, кто сгенерирует эту задачу VM_Exit
и отправит ее на VM Thread
позже? Меня особенно беспокоит то, как для 143 установлено значение VM_Exit::_exit_code
?
Я запустил JVM HotSpot под GDB со следующим основным классом:
public class Main{
public static void main(String args[]) throws Exception {
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
System.out.println("Shutdown hook is called");
}));
Thread.sleep(1000000);
}
}
И не нашел, что Signal Dispatcher
отправлял задачу VM_Exit
. Прекращение произошло в этом заявлении :
JavaCalls::call_virtual(&result,
threadObj, thread_klass,
vmSymbols::exit_method_name(),
vmSymbols::void_method_signature(),
THREAD);