Sun JVM故障排除的工具和提示

我们在Sun JVM版本1.6.0_11之上运行一组ColdFusion 8服务器。 偶尔服务器会停止响应请求。 到目前为止,我们已经确定JVM正在locking,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 

如果你在Linux上,你可以使用kill -3来获得线程转储,并使用线程转储分析器寻找死锁。

VisualVM现在作为JDK的一部分提供,可用于监视内存使用情况,线程,还包含分析器。

jmap可用于从Java进程获取堆直方图和堆转储。 然后你可以使用像Eclipse Memory Analyzer这样的工具来调查它。

作为提到的另一个答案,你可以看看JMX和JConsole。 对于我们应用程序中的每个服务,我们都有一个MBean,所以我们可以查看关键字统计信息,如队列大小,以检查是否有什么exception。

这是我的configuration的标准选项:

 -XX:+HeapDumpOnOutOfMemoryError 

我也有基本的JVM健康特征(如堆大小,线程数)的SNMP / RRD监视…还有更多。

那么,就有像jconsole这样的工具的整个世界…

您需要查看JMX监视 – 它可以让您很好地了解JVM内部正在发生的事情。

要开始,请将-Dcom.sun.management.jmxremote.port = portNun添加到上面的列表中。 然后,在另一台机器上运行jconsole并告诉它连接到上面指定的机器和端口。 随意打开,看看哪些线程正在运行,以及停止响应请求后发生了什么。

jvmstat在过去对我很有帮助,虽然我不认为我和CF 8 / JRE 1.6一起使用了它。 它有很好的显示每一代的东西,所以你可以看到,如果你的一些内存variables造成的问题。

你可以使用jstat来查看堆的使用情况。

jstat -gc -h10 -t 1000