首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java 7 Hotspot JVM在Linux上使用SIGRT*吗?

Java 7 Hotspot JVM在Linux上使用SIGRT*吗?
EN

Stack Overflow用户
提问于 2013-12-12 06:19:50
回答 1查看 469关注 0票数 2

我们有一个java服务,它加载在Linux上的本机守护进程中。这个守护进程阻止大多数信号并安装自己的信号处理程序,因为这个进程是一个通用的任务关键应用程序。这也是一个多线程应用程序,它大量地利用了线程,并且HotSpot JVM被加载在其中一个线程中。

在64位Linux (SLES,RH)上升级到Java7JVM之后,我们注意到当套接字关闭时,等待连接的ServerSocket不会收到信号。根据JavaDoc,当前在accept()中阻塞的任何线程都会抛出一个SocketException,这样,当服务关闭时,我们就会关闭侦听套接字。我们怀疑我们在本机过程中处理信号的方式,因为我们在几年前就有过类似的经历,结果变成了事实。

在我们的本机过程中,我们阻塞信号,如下所示(伪码)。我们确实使用sigaction()安装了自己的处理程序,如下所示。

代码语言:javascript
复制
sigset_t    set;
sigfillset(&set);
sigdelset(&set, SIGTRAP);
sigdelset(&set, SIGSEGV);

/* Remove following signals as it appears to be used by JVM */
for (int s = SIGRTMIN; s <= SIGRTMAX-4; s++) {
    sigdelset(&set, s);
}

if ((err = pthread_sigmask(SIG_BLOCK, &set, 0)) != 0) {
    err_warn(“Unable to block signals: %d”, err);
}

/* pthread_create() for LoadJVM calls and continue. 
   Threads are detached and hence no join()          */

/* Read current mask */
pthread_sigmask(SIG_BLOCK, 0, &set);

/* Wait on these signals */

while (bshutdown == false) {
    if ((sig = sigwaitinfo(&set, &info)) == -1) {
        /* something unexpected happened */
    }
    switch (sig) {
        /* Do something */
    }
}

我们在新JVM中发现的是,如果将SIGRTMAX-2和SIGRTMAX-3从集合中删除,Java将不会在关闭时得到通知。目前,我们添加这两个信号并在加载JVM以解决问题的线程中调用pthread_sigmask(SIG_UNBLOCK &set,0)。

我的问题是:

  1. 有没有人知道JVM是否使用这些信号。JavaDoc在信号处理中的应用没有列出他们。
  2. 在Linux上(在x86_64内核2.6.32,3.11.6上测试),读取当前信号掩码(pthread_sigmask(SIG_UNBLOCK, 0, &set))不返回当前掩码。set只是0。有人见过这种行为吗?它在OSX和Solaris上工作得很好。
EN

回答 1

Stack Overflow用户

发布于 2013-12-12 08:39:16

谢谢您建议使用strace。虽然我使用strace查看JVM是如何阻塞信号的,但我没有考虑检查套接字是如何关闭的。这就是我发现的..。

代码语言:javascript
复制
[pid  5525] rt_sigprocmask(SIG_BLOCK, [QUIT], NULL, 8) = 0
========== Waiting for 30 sec before shutdown ==========
========== IP : 0.0.0.0, Port : 9999 ==========
[pid  5525] rt_sigaction(SIGRT_30, {0x7f8844015200, [], SA_RESTORER, 0x7f884de779f0}, NULL, 8) = 0
[pid  5525] rt_sigprocmask(SIG_UNBLOCK, [RT_30], NULL, 8) = 0
========== Shutting down ==========
[pid  5516] tgkill(5515, 5525, SIGRT_30 <unfinished ...>
[pid  5525] --- SIGRT_30 {si_signo=SIGRT_30, si_code=SI_TKILL, si_pid=5515, si_uid=1000} ---
[pid  5525] rt_sigreturn()              = -1 EINTR (Interrupted system call)
[pid  5516] <... tgkill resumed> )      = 0

这意味着,SIGRT_30 (SIGRTMAX_2)在监听套接字关闭时发出信号。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20536386

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档