我们在 Sun JVM 1.6.0_11 版本上运行一组 ColdFusion 8 服务器。有时,服务器会停止响应请求。到目前为止,我们已经确定 JVM 已锁定,并且 ColdFusion 和 IIS 都不是问题的根源。我已将我们的 JVM 参数包含在下方。我们应该查看其他 JVM 设置吗?是否有任何工具可以监视、跟踪或从 JVM 内部获取指标,以便我们了解崩溃发生时它在做什么?还有其他 JVM 故障排除技巧吗?
-server
-Xms1024m
-Xmx1024m
-Dsun.io.useCanonCaches=false
-XX:MaxPermSize=256m
-XX:PermSize=256m
-XX:+UseParallelGC
-Dsun.rmi.dgc.client.gcInterval=300000
-Dsun.rmi.dgc.server.gcInterval=300000
-Djmx.invoke.getters=true
答案1
如果你使用的是 Linux,你可以使用 kill -3 来获取线程转储,并使用以下方法查找死锁:线程转储分析器。
可视化虚拟机现在作为 JDK 的一部分提供,可以用来监视内存使用情况、线程,还包括一个分析器。
地图可用于从 Java 进程获取堆直方图和堆转储。然后,您可以使用类似Eclipse 内存分析器去调查它。
正如另一个答案所提到的,您可以研究 JMX 和 JConsole。对于我们应用程序中的每个服务,我们都有一个 MBean,因此我们可以查看关键统计信息(例如队列大小),以检查是否有任何异常。
答案2
这是我的配置的标准选项:
-XX:+HeapDumpOnOutOfMemoryError
我还使用 SNMP/RRD 监控基本的 JVM 健康特性(比如堆大小、线程数)......还有更多。
然后,还有像 jconsole 这样的整个工具世界……
答案3
你需要调查JMX 监控- 它可以让您深入了解 JVM 内部发生的情况。
首先,将 -Dcom.sun.management.jmxremote.port=portNun 添加到上面的列表中。然后,在另一台机器上,运行 jconsole 并告诉它连接到上面指定的机器和端口。随意查看一下,看看哪些线程正在运行,以及在它停止响应请求后发生了什么。
答案4
您可以使用 jstat 查看堆的使用情况。
jstat -gc -h10 -t 1000