Java 8-进程启动数周后无法连接到VM

Java 8-进程启动数周后无法连接到VM,java,tomcat,jboss,jconsole,jmc,Java,Tomcat,Jboss,Jconsole,Jmc,我有一个生产环境(RHEL 7、Java 1.8.0_102-b14),其中运行着大量JBoss(EAP 7)、Tomcat(8)和独立进程。自18天前的上一次发布以来,我们的所有流程都一直在运行。我无法使用Attach API连接到JBoss和独立进程。jstack或下面的简单连接失败。所有这些方法都适用于我的Tomcat进程或我启动的任何新进程 这个问题不会影响任何正在运行的进程,但我们的监控软件不再运行 public class Attach{ public static void

我有一个生产环境(RHEL 7、Java 1.8.0_102-b14),其中运行着大量JBoss(EAP 7)、Tomcat(8)和独立进程。自18天前的上一次发布以来,我们的所有流程都一直在运行。我无法使用Attach API连接到JBoss和独立进程。jstack或下面的简单连接失败。所有这些方法都适用于我的Tomcat进程或我启动的任何新进程

这个问题不会影响任何正在运行的进程,但我们的监控软件不再运行

public class Attach{
    public static void main( String [] args ) throws Exception {
        com.sun.tools.attach.VirtualMachine vm = com.sun.tools.attach.VirtualMachine.attach( args[ 0 ] );
        System.out.println( vm.getSystemProperties() );
    }
}
我的tomcat进程都响应正常,如果我启动任何新的JBoss或独立进程,我也可以连接到它们。进程加载的库集似乎没有任何区别。我的JBoss进程的线程数是~2k,ClientProcess运行的线程数是~490,tomcat运行的线程数是~270

以下是jstack错误:

26346: Unable to open socket file: target process not responding or HotSpot VM not loaded
The -F option can be used when the target process is not responding
我可以从本地机器上使用JMC进行连接,但是需要几分钟的时间来响应和加载视图。如果我在jstack中使用“-F”选项,它将在挂起之前生成以下输出

Attaching to process ID 26346, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.102-b14
Deadlock Detection:

No deadlocks found.
我已经让这个运行,它还没有连接,但我会更新后,如果它这样做

我计划在这个周末发布一个版本,可以重新启动所有我认为可以修复的进程,但这不是一个长期的解决方案。在下一个版本中,我将尝试将'-XX:+StartAttachListener'标志添加到我们的所有流程中,看看这是否有帮助,但可能很难重现

更新#1:运行“kill-3”会转储正在运行的线程,我可以看到AttachListener正在一个没有响应的进程上运行:

"Attach Listener" #767 daemon prio=9 os_prio=0 tid=0x00002b88a0008000 nid=0x27d0 runnable [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE
我没有看到任何死锁的线程

更新#2

JBoss、单机版和Tomcat进程之间有一个我没有考虑过的差异。JBoss EAP 7通过其管理端口公开JMX连接。您可以通过在bootclasspath上使用jboss-client.jar运行JMC来连接它。对于Tomcat,我使用以下参数显式公开jmx,以便远程管理它。是否有可能启用jmxremote会以某种方式使本地JMX附加侦听器处于响应状态

-Dcom.sun.management.jmxremote 
-Dcom.sun.management.jmxremote.port=12345
-Dcom.sun.management.jmxremote.ssl=false 
-Dcom.sun.management.jmxremote.authenticate=false 

将JMC连接到长时间运行的独立进程(而不是JBoss或Tomcat)是否有效?无论成功与否,都可以看到“jmc-consoleLog-debug”的输出。启用JMX代理(甚至只是本地代理)有助于JMC连接到流程。也许它还能避免一些与连接相关的错误?独立进程不接受连接。Tomcat连接正常,我和你一样怀疑这与启用jmxremote有关。仅供参考@Klara,我已经重新启动了我的prod环境,所以现在没有问题,也没有办法测试任何理论。这将是一个很难复制的过程!