SIGSTOP 和 SIGTSTP 会损坏 JVM?

mar*_*iop 5 java linux jvm signals jvm-hotspot

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

Jif*_*ang 4

SIGSTOP且不SIGTSTP包含在 HotSpot JVM 的信号处理中并不意味着 HotSpot JVM 不支持它们。

这仅意味着对这两个信号没有特殊处理。一些信号(SIGSEGVSIGTERM等)由 HotSpot JVM 专门处理,以实现某些功能(隐式空检查、关闭挂钩等)。

没有经过特殊处理的,它们将按照默认方式运行。因此,当 HotSpot 接收到SIGSTOP和 时SIGTSTP,它将按照默认方式运行,这意味着PauseTerminal Pause

其实也SIGSTOP不能忽视。来自 signal(7) 的手册页

这些信号SIGKILL无法SIGSTOP被捕获、阻止或忽略。

我们可以通过一个简单的 C 程序来演示这一点:

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

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

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

SIGSTOP或没有任何信号处理SIGTSTP,但您仍然可以将它们发送到这个简单的程序,它们将正常运行。

按 Ctrl+Z 将发送SIGTSTP信号,按 runkill -19 pid将发送SIGSTOP信号。并且演示程序将暂停。

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