【问题标题】:Profile Tomcat Application With VisualVM使用 VisualVM 分析 Tomcat 应用程序
【发布时间】:2023-03-03 05:08:25
【问题描述】:

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

详情……

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

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

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

【问题讨论】:

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

标签: tomcat6 visualvm


【解决方案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

【讨论】:

  • 带任务控制
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-29
  • 1970-01-01
  • 2015-01-29
  • 1970-01-01
  • 2011-05-25
  • 1970-01-01
  • 2012-07-23
相关资源
最近更新 更多