java-SIGSTOP和SIGTSTP会损坏JVM吗?
作者:互联网
在Linux中,可以使用两种不同的信号来暂停进程,即SIGSTOP和SIGTSTP. HotSpot虚拟机,SIGSTOP和SIGTSTP because is not handled by HotSpot均无法通过HotSpot虚拟机进行处理.我想知道发送这两个信号是否安全,或者如果不安全,将影响JVM的哪一部分(例如垃圾收集器).请注意,我并不关心在JVM上运行的程序可能遇到的问题,我对JVM的内部特别感兴趣.将STOP / TSTP发送到JVM是否安全?
解决方法:
SIGSTOP和SIGTSTP不包含在HotSpot JVM的signal handling中并不意味着HotSpot JVM不支持它们.
这仅意味着对这两个信号没有特殊处理. HotSpot JVM专门处理了一些信号(SIGSEGV,SIGTERM等)以实现certain features(隐式空检查,关闭挂钩等).
那些没有特别处理的,将采用默认方式.因此,当HotSpot收到SIGSTOP和SIGTSTP时,它将表现为默认方式,即暂停和终端暂停.
实际上,SIGSTOP不能被忽略.从signal(7)的man page:
The signals
SIGKILL
andSIGSTOP
cannot be caught, blocked, or ignored.
我们可以通过一个简单的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信号,并使我们的演示程序重新执行.
标签:jvm,jvm-hotspot,linux,java,signals 来源: https://codeday.me/bug/20191030/1969915.html