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 and SIGSTOP 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信号,并使我们的演示程序重新执行.

    公众号
    关注公众号订阅更多技术干货!