使用 VisualVM 分析 Tomcat 应用程序

Posted

技术标签:

【中文标题】使用 VisualVM 分析 Tomcat 应用程序【英文标题】:Profile Tomcat Application With VisualVM 【发布时间】:2010-12-25 19:33:26 【问题描述】:

我想使用 VisualVM 工具分析在 Tomcat 上运行的应用程序。不幸的是,当我告诉 VisualVM 分析 Tomcat 时,Tomcat 会打印出几条消息,表明它正在连接到分析工具,然后就直接退出了。

详情……

我使用的是 Windows XP、Tomcat 6、VisualVM 1.2.1 和 JDK 1.6.0_11。

    在 Visual VM 中,我右键单击 Tomcat 应用程序并选择“配置文件” 在 Profiler 选项卡中,我按下 Memory 按钮(或 CPU 按钮)。 Tomcat 退出

请注意,如果我右键单击 Tomcat 应用程序并选择“Heap Dump”,似乎可以正常工作。

【问题讨论】:

有人使用 VisualVM 来分析 Tomcat 应用程序吗? 通过 JMX 或 JStatd 连接时,我没有看到“配置文件”选项卡。我需要特殊版本的 java 或 jvisualvm 吗? 通过 JMX 连接时,我也没有看到“配置文件”选项卡。此问题是否已为其他人解决? 【参考方案1】:

我现在有VisualVM 配置文件正在使用我的Tomcat 应用程序。我需要在tomcat启动中添加以下参数:

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

Here is a nice article 正在监视 TomcatVisualVM

【讨论】:

谢谢,我可以在可视虚拟机中看到创建的对象等。我怀疑我们在应用程序中有内存泄漏,我想看看哪个对象持有哪些对象的引用? + 哪些对象占用了多少内存?它是tomcat的对象还是它的应用程序的对象。我想追踪到代码级别是否可能?是否可以使用 visualvm 以某种方式附加我的代码?提前致谢。 这不是分析。那就是采样。我有一个 JMX 连接,但只有 CPU 采样可用。如何使用 tomcat6.exe 获得分析(仪器 + 内存)? 最近配置了linux,如果需要smdprogrnotes.blogspot.com/2012/07/… @Chloe 我刚碰到这个。我发现,如果我停止 Tomcat6 服务并将 Tomcat6.exe 作为命令行应用程序运行,VisualVM 能够作为本地 JVM 连接到它,并且内存分析可用。【参考方案2】:

是的,我们会分析 Tomcat 应用程序。

转至catalina.batcatalina.sh,然后转至您的JAVA_OPTS(我使用的是 Tomcat 6.0.16):

-Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=9090 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false

你的JAVA_OPTS 应该是这样的

set JAVA_OPTS=%JAVA_OPTS% -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.util.logging.config.file="%CATALINA_BASE%\conf\logging.properties" -Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=9090 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false

在 Ryan 评论后更新,最好使用 setenv.sh。这是我的 JDK 8 的 setenv.sh。缺少其他一些设置,但很好开始。

SUN_JVM_OPTS="
    -server \
    -XX:MaxMetaspaceSize=3G \
    -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled \
    -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 \
    -XX:+ScavengeBeforeFullGC -XX:+CMSScavengeBeforeRemark \
    -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=3 -XX:GCLogFileSize=2M \
    -XX:+HeapDumpOnOutOfMemoryError \
    -Dsun.net.inetaddr.ttl=60 \
    -Dcom.sun.management.jmxremote  \
    -Dcom.sun.management.jmxremote.port=8480 \
    -Dcom.sun.management.jmxremote.authenticate=false \
    -Dcom.sun.management.jmxremote.ssl=false"


# Set custom application options here
APPLICATION_OPTS="-Dlog4j.configurationFile=patht-to-log/log4j2.xml -Dlog4j.debug=true "

JVM_OPTS="$GENERAL_JVM_OPTS $SUN_JVM_OPTS"
CATALINA_OPTS="$JVM_OPTS $APPLICATION_OPTS"
echo "Tomcat started with settings "$CATALINA_OPTS

setenv.sh 放入bin 目录后,您可以在启动时在控制台中看到更改。

这是另一个使用 Visual VM 分析 Tomcat 应用程序的分步教程: Trouble shooting application performance with Visual VM

【讨论】:

如果我按照链接上的说明操作,我可以将 VisualVM 连接到 tomcat,但没有配置文件选项卡。另外,描述也不准确。它说“单击本地或远程”,但 VisualVM 中没有这样的选择。我选择了“添加 JMX 连接”并指定了“localhost:9090”连接。我想这就是他们的意思...... 你真的不应该为此使用 JAVA_OPTS - 你应该在 bin/setenv.sh 文件中使用 CATALINA_OPTS 代替(你不应该编辑 catalina.sh - 它已经为你调用了 setenv.sh ) 同意。更新了答案【参考方案3】:

我使用的是 Tomcat 7,完整配置需要更多参数才能工作。

-Dcom.sun.management.jmxremote=true 
-Dcom.sun.management.jmxremote.port=9090 # port to connect JMX 
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
-Djava.rmi.server.hostname=50.112.22.47" # IP of the server running tomcat (it is necessary)

来源:http://blog.markshead.com/1129/connecting-visual-vm-to-tomcat-7/

【讨论】:

添加 java.rmi.server.hostname 对我有用。它可以是 ip 或主机名【参考方案4】:

您只需设置这些虚拟机选项:

-XX:+UnlockCommercialFeatures -XX:+FlightRecorder -XX:+UnlockDiagnosticVMOptions -XX:+DebugNonSafepoints -XX:FlightRecorderOptions=stackdepth=512

【讨论】:

带任务控制

以上是关于使用 VisualVM 分析 Tomcat 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

使用 visualvm 分析 Tomcat Web 应用程序

当我打开visualvm分析器时tomcat关闭

如何在 STS 中使用 VisualVM 分析器?

了解 visualvm 分析器中的 CPU 时间

使用 VisualVM 监控 Java 应用程序

使用 VisualVM 和 SSH 远程监控 Tomcat 7 服务器