mar*_*iop 5 java linux jvm signals jvm-hotspot
在 Linux 中,有两种不同的信号可用于暂停进程:SIGSTOP和SIGTSTP。两者都不由HotSpot 虚拟机处理,SIGSTOP 是因为无法捕获,SIGTSTP 是因为不由HotSpot处理。我想知道发送这两个信号是否安全,或者如果不安全,JVM 的哪些部分会受到影响(例如垃圾收集器)。请注意,我不关心 JVM 上运行的程序可能出现的问题,我对JVM的内部结构特别感兴趣。向JVM发送STOP/TSTP是否安全?
SIGSTOP
且不SIGTSTP
包含在 HotSpot JVM 的信号处理中并不意味着 HotSpot JVM 不支持它们。
这仅意味着对这两个信号没有特殊处理。一些信号(SIGSEGV
、SIGTERM
等)由 HotSpot JVM 专门处理,以实现某些功能(隐式空检查、关闭挂钩等)。
没有经过特殊处理的,它们将按照默认方式运行。因此,当 HotSpot 接收到SIGSTOP
和 时SIGTSTP
,它将按照默认方式运行,这意味着Pause和Terminal Pause。
其实也SIGSTOP
不能忽视。来自 signal(7) 的手册页:
这些信号
SIGKILL
无法SIGSTOP
被捕获、阻止或忽略。
我们可以通过一个简单的 C 程序来演示这一点:
#include<stdio.h>
#include<unistd.h>
int main()
{
while(1)
{
printf("Hello World\n");
usleep(900000);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
SIGSTOP
或没有任何信号处理SIGTSTP
,但您仍然可以将它们发送到这个简单的程序,它们将正常运行。
按 Ctrl+Z 将发送SIGTSTP
信号,按 runkill -19 pid
将发送SIGSTOP
信号。并且演示程序将暂停。
在这两种情况下,运行 akill -18 pid
将发送SIGCONT
信号并使我们的演示程序恢复执行。