gpt4 book ai didi

java - 发送SIGTERM时,VM_Exit是如何传递给VM Thread的?由谁传递?

转载 作者:行者123 更新时间:2023-12-02 01:26:28 25 4
gpt4 key购买 nike

我试图了解 JVM 热点如何处理终止信号(例如 SIGTERM)。我发现 SIGTERM 信号配置已设置 at this pointUserHandler ,它看起来像(省略注释):

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 线程

问题:您能否提示一下谁生成此 VM_Exit 任务并稍后将其发送到 VM Thread?我特别关心 143 如何设置为 VM_Exit::_exit_code

我使用以下主类在 gdb 下运行 JVM HotSpot:

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任务。终止发生在 that statement :

JavaCalls::call_virtual(&result,
threadObj, thread_klass,
vmSymbols::exit_method_name(),
vmSymbols::void_method_signature(),
THREAD);

最佳答案

SIGTERMSIGINTSIGHUPJava code 中处理java.lang.Terminator

async-profiler 鲜为人知的功能之一它可以分析任意 native 函数并显示混合的 Java+ native 堆栈。例如。如果您想拦截JVM_Halt并查看Java代码调用它,请运行

$ java -agentpath:/path/to/libasyncProfiler.so=start,traces,threads,event=JVM_Halt Main

Started [JVM_Halt] profiling
^CShutdown hook is called
--- 1 events (100.00%), 1 sample
[ 0] JVM_Halt
[ 1] java.lang.Shutdown.halt0
[ 2] java.lang.Shutdown.halt
[ 3] java.lang.Shutdown.exit
[ 4] java.lang.Terminator$1.handle
[ 5] jdk.internal.misc.Signal$1.run
[ 6] java.lang.Thread.run
[ 7] [SIGINT handler tid=19080]

关于java - 发送SIGTERM时,VM_Exit是如何传递给VM Thread的?由谁传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56838724/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com