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