Java SIGSTOP和SIGTSTP会损坏JVM吗?
在Linux中,有两种不同的信号可用于暂停进程,即SIGSTOP和SIGTSTP。这两个都不由热点虚拟机处理,因为无法捕获SIGSTOP和SIGTSTP。我想知道发送这两个信号是否安全,或者如果不安全,JVM的哪个部分会受到影响(例如垃圾收集器)。请注意,我不关心JVM上运行的程序可能存在的问题,我特别感兴趣的是JVM的内部结构。向JVM发送STOP/TSTP安全吗?Java SIGSTOP和SIGTSTP会损坏JVM吗?,java,linux,jvm,signals,jvm-hotspot,Java,Linux,Jvm,Signals,Jvm Hotspot,在Linux中,有两种不同的信号可用于暂停进程,即SIGSTOP和SIGTSTP。这两个都不由热点虚拟机处理,因为无法捕获SIGSTOP和SIGTSTP。我想知道发送这两个信号是否安全,或者如果不安全,JVM的哪个部分会受到影响(例如垃圾收集器)。请注意,我不关心JVM上运行的程序可能存在的问题,我特别感兴趣的是JVM的内部结构。向JVM发送STOP/TSTP安全吗?SIGSTOP和SIGTSTP不包括在HotSpot JVM中并不意味着HotSpot JVM不支持它们 这只意味着对这两个信号没
SIGSTOP
和SIGTSTP
不包括在HotSpot JVM中并不意味着HotSpot JVM不支持它们
这只意味着对这两个信号没有特殊处理。一些信号(SIGSEGV
,SIGTERM
等)由HotSpot JVM专门处理以实现(隐式空检查、关闭挂钩等)
未经特殊处理的,其行为将采用默认方式。因此,当热点接收到SIGSTOP
和SIGTSTP
时,它将以默认方式运行,这意味着暂停和终端暂停
事实上,SIGSTOP
不能被忽略。来自信号(7)的:
无法捕获、阻止或忽略信号SIGKILL
和SIGSTOP
我们可以通过一个简单的C程序来演示这一点:
#include<stdio.h>
#include<unistd.h>
int main()
{
while(1)
{
printf("Hello World\n");
usleep(900000);
}
return 0;
}
#包括
#包括
int main()
{
而(1)
{
printf(“Hello World\n”);
美国LEEP(900000);
}
返回0;
}
对于SIGSTOP
或SIGTSTP
,没有信号处理,但是您仍然可以将它们发送到这个简单的程序,它们将正常工作
按Ctrl+Z键将发送一个SIGTSTP
信号,运行kill-19 pid
将发送一个SIGSTOP
信号。演示程序将暂停
在这两种情况下,运行
kill-18pid
将发送SIGCONT
信号,并使我们的演示程序返回执行状态。如果SIGTSTP
可能损坏它,老实说,这将是一个严重的错误;我在终端上挂起Java命令行程序从来没有遇到过任何问题,所以我认为SIGTSTP
根本不是问题。