SIGSTOP和SIGTSTP会破坏JVM吗?

时间:2013-07-03 16:14:06

标签: java linux jvm signals jvm-hotspot

在Linux中,有两种不同的信号可用于暂停进程, SIGSTOP SIGTSTP 。两者都不由 HotSpot虚拟机 SIGSTOP 处理,因为无法捕获并且 SIGTSTP because is not handled by HotSpot。我想知道发送这两个信号是否安全,或者,如果它不安全, JVM 的哪个部分会受到影响(例如垃圾收集器)。请注意,我不关心 JVM 上运行的程序可能存在的问题,我特别感兴趣的是 JVM 的内部。将 STOP / TSTP 发送到 JVM 是否安全?

1 个答案:

答案 0 :(得分:4)

SIGSTOPSIGTSTP未包含在HotSpot JVM中signal handling并不代表HotSpot JVM不支持它们。

这仅表示对这两个信号没有特殊处理。一些信号(SIGSEGVSIGTERM等)由HotSpot JVM专门处理以实现certain features(隐式空检查,关闭挂钩等)。

那些没有特别处理的,他们将采用默认方式。因此,当HotSpot收到SIGSTOPSIGTSTP时,它将采用默认方式,即暂停终端暂停

事实上,SIGSTOP不容忽视。来自signal(7)的man page

  

无法捕获,阻止或忽略信号SIGKILLSIGSTOP

我们可以通过一个简单的C程序证明这一点:

#include<stdio.h>
#include<unistd.h>

int main()
{
  while(1)
  {
    printf("Hello World\n");
    usleep(900000);
  }

  return 0;
}

SIGSTOPSIGTSTP没有信号处理,但是你仍然可以将它们发送到这个简单的程序,它们会表现正常。

按Ctrl + Z将发送SIGTSTP信号,运行kill -19 pid将发送SIGSTOP信号。演示程序将暂停。

在这两种情况下,运行kill -18 pid都会发送SIGCONT信号并将我们的演示程序恢复执行。