在Linux中,有两种不同的信号可用于暂停进程, SIGSTOP 和 SIGTSTP 。两者都不由 HotSpot虚拟机, SIGSTOP 处理,因为无法捕获并且 SIGTSTP because is not handled by HotSpot。我想知道发送这两个信号是否安全,或者,如果它不安全, JVM 的哪个部分会受到影响(例如垃圾收集器)。请注意,我不关心 JVM 上运行的程序可能存在的问题,我特别感兴趣的是 JVM 的内部。将 STOP / TSTP 发送到 JVM 是否安全?
答案 0 :(得分:4)
SIGSTOP
和SIGTSTP
未包含在HotSpot JVM中signal handling并不代表HotSpot JVM不支持它们。
这仅表示对这两个信号没有特殊处理。一些信号(SIGSEGV
,SIGTERM
等)由HotSpot JVM专门处理以实现certain features(隐式空检查,关闭挂钩等)。
那些没有特别处理的,他们将采用默认方式。因此,当HotSpot收到SIGSTOP
和SIGTSTP
时,它将采用默认方式,即暂停和终端暂停。
事实上,SIGSTOP
不容忽视。来自signal(7)的man page:
无法捕获,阻止或忽略信号
SIGKILL
和SIGSTOP
。
我们可以通过一个简单的C程序证明这一点:
#include<stdio.h>
#include<unistd.h>
int main()
{
while(1)
{
printf("Hello World\n");
usleep(900000);
}
return 0;
}
SIGSTOP
或SIGTSTP
没有信号处理,但是你仍然可以将它们发送到这个简单的程序,它们会表现正常。
按Ctrl + Z将发送SIGTSTP
信号,运行kill -19 pid
将发送SIGSTOP
信号。演示程序将暂停。
在这两种情况下,运行kill -18 pid
都会发送SIGCONT
信号并将我们的演示程序恢复执行。