使用 JConsole 等连接到冻结的 jvm

Posted

技术标签:

【中文标题】使用 JConsole 等连接到冻结的 jvm【英文标题】:Connect to frozen jvm with JConsole etc 【发布时间】:2016-03-28 12:36:56 【问题描述】:

我们正在尝试分析在生产中运行的远程 tomcat 应用程序。问题是网络池中的所有线程都被阻塞了,这似乎阻止了我们与 jconsole、jmc 甚至 YourKit 的连接。当 jvm 运行良好时,所有这些工具都可以正常工作。

来自 jconsole 的错误是超时:

Could not connect to server1:9090 : Failed to retrieve RMIServer stub: javax.naming.CommunicationException [Root exception is java.rmi.ConnectIOException: error during JRMP connection establishment; nested exception is: 
java.net.SocketTimeoutException: Read timed out]
Could not connect to server1:9090. Make sure the JVM is running and that you are using the correct protocol in the Service URL (service:jmx:rmi:///jndi/rmi://server1:9090/jmxrmi).

这使得我们很难弄清楚我们的应用程序出了什么问题。服务器不使用太多 cpu 并且有空闲内存。所以没有明显的资源匮乏。 jvm 似乎已经死了

Java 版本:jdk1.7.0_75 Tomcat 版本:7.0.65

在这种情况下如何连接到 jvm 有什么想法吗?

【问题讨论】:

也许你可以试试jstack -F <pid> 强制线程转储。 日志中有什么内容吗? JVM进程的工作目录呢?如果启用-XX:+HeapDumpOnOutOfMemoryError 会怎样?有可能是 JVM 脑残到不能接电话…… 以 jstack -F stack-trace.log 开始 @ChristopherSchultz:这不是内存问题。我们认为这与高流量期间休眠中的类加载器有关 【参考方案1】:

你有几个选择:

    发送 SIGQUIT (Linux) 或 Control-Break (Windows) 并获取堆栈 跟踪。 获取核心转储(Linux 上的 gcore),然后您就可以使用 JVM jstack 之类的工具和使用核心文件的朋友

【讨论】:

在windows中终止一个java进程除了返回提示外没有任何作用 SIGQUIT 与 SIGKILL/SIGTERM 不同,它不会杀死 Java 进程。

以上是关于使用 JConsole 等连接到冻结的 jvm的主要内容,如果未能解决你的问题,请参考以下文章

JConsole 远程连接到 JBoss EAP

jconsole 无法连接到我的新 Mac Air 上的本地进程

不能使用jconsole连接到JBoss eap7.1

无法连接到 Jconsole - cassandra k8 集群

JVM 监控工具——jconsole

使用JCONSOLE远程监控JVM