【问题标题】:SIGSTOP and SIGTSTP can damage the JVM?SIGSTOP 和 SIGTSTP 会损坏 JVM 吗?
【发布时间】:2013-07-03 16:14:06
【问题描述】:

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

【问题讨论】:

  • 如果SIGTSTP 会损坏它,老实说,这将是一个严重的错误;在终端暂停 Java 命令行程序我从来没有遇到过任何问题,所以我认为 SIGTSTP 根本不是问题。

标签: java linux jvm signals jvm-hotspot


【解决方案1】:

SIGSTOPSIGTSTP 不包含在 HotSpot JVM 的 signal handling 中并不意味着 HotSpot JVM 不支持它们。

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

那些没有特别处理的,他们会按照默认的方式。因此当 HotSpot 接收到SIGSTOPSIGTSTP 时,它会按照默认方式运行,即PauseTerminal Pause

事实上,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 信号并使我们的演示程序重新执行。

【讨论】:

  • 只是对答案感到好奇。取消暂停后是否会继续睡眠时间。例如:如果 Thread.sleep 是 10 秒,如果我们暂停 5 秒,它会在取消暂停后休眠 10 秒还是 5 秒?
  • sleep 只是在一段时间内从 RUNQUEUE 中删除一个进程。当睡眠到期时,调度程序将其放回 RUNQUEUE。所以回答你,是的,即使进程暂停,睡眠时间也会继续。对于 10 秒的睡眠,如果您在其睡眠的第 5 秒暂停一个进程接下来的 10 秒,那么当您恢复该进程时,它已准备好运行
猜你喜欢
  • 2012-08-06
  • 1970-01-01
  • 2012-08-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-09
  • 2016-05-16
  • 1970-01-01
  • 2016-06-02
相关资源
最近更新 更多