使用VisualVM

时间:2016-08-18 23:08:46

标签: java tomcat profiling jvisualvm

我试图在用户名tomcat6下运行visualvm,因为显然visualvm只能找到在其用户名下运行的应用程序。所以默认情况下它只是查找在我的用户名下运行的应用程序我已经能够将visualvm与tomcat6连接到jmx,但缺少精细分析的精细粒度。

我尝试了以下命令在用户名tomcat6下运行visualvm,但得到了以下错误,我不明白。

$ sudo -u tomcat6 jvisualvm
No protocol specified
Exception in thread "main" java.awt.AWTError: Can't connect to X11 window server using ':0' as the value of the DISPLAY variable.
    at sun.awt.X11GraphicsEnvironment.initDisplay(Native Method)
    at sun.awt.X11GraphicsEnvironment.access$200(X11GraphicsEnvironment.java:65)
    at sun.awt.X11GraphicsEnvironment$1.run(X11GraphicsEnvironment.java:115)
...

4 个答案:

答案 0 :(得分:2)

不幸的是,只有采样在远程模式下可用,因此JMX将缺少仪器工具。

实际上,您在visualvm用户下运行tomcat6的方法是正确的。您应该看看这个question如何在sudo下运行X11个应用程序。

传递DISPLAYXAUTHORITY环境变量的最简单方法是使用sudo -E命令来保留当前用户环境。

此外,如果您无法在tomcat6用户下看到您的流程,则应检查CATALINA_TMPDIR是否指向/tmp。否则你应该把它传递给visualvm

jvisualvm -J-Djava.io.tmpdir="${CATALINA_TMPDIR}"

实际上,Java代理程序附带了许多替代方法,例如yourkitjprofiler,可以进行远程检测分析。

答案 1 :(得分:2)

最简单的方法是在Tomcat上打开一个远程JXM端口,以便能够远程(从台式计算机)使用jvisualvm连接到远程Tomcat(在您的服务器上)。

您需要将以下系统属性传递给JVM:

-Dcom.sun.management.jmxremote 
-Dcom.sun.management.jmxremote.port=<whatever_port_you_want>
-Dcom.sun.management.jmxremote.ssl=false

然后在本地计算机上打开jvisualvm(JVM版本需要相同或更新),文件 - &gt;添加远程主机 - &gt;在主机上输入名称。它将为该主机创建一个条目。右舔这个条目 - &gt;添加JMX连接 - &gt;输入端口 - &gt;行

然后,

jvisualvm将能够远程访问您的应用程序。

如果需要,您还可以使用以下系统属性来保护连接(您需要创建文件并在任意位置找到它们:

-Dcom.sun.management.jmxremote.password.file=jmxremote.password 
-Dcom.sun.management.jmxremote.access.file=jmxremote.access 

需要将这些属性添加到CATALINA_OPTS环境变量中。 Fr例证:

export CATALINA_OPTS = "$CATALINA_OPTS -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8888 "

有关JMX的更多信息,请访问:https://docs.oracle.com/javase/8/docs/technotes/guides/management/agent.html

答案 2 :(得分:2)

如果运行应用程序的计算机是远程的(如服务器),则无法在没有工作的情况下运行GUI应用程序。启用VisualVM的远程访问可能会更容易。

您可以使用两种技术连接到远程JVM:使用jstatd或使用JMX。我不确定您认为使用JMX会丢失什么,但显然jstatd不允许您访问性能分析工具,CPU监视器等。)

您需要配置JVM和Tomcat以允许远程访问。这需要3个步骤:

  1. 启用远程JMX。事实证明,there's a guide for that

  2. 修复用于RMI的“漫游端口”。还有一个guide for that

  3. (可选)安排对服务器的安全远程访问。最简单的方法是使用ssh -Lport:localhost:port和一系列-L参数将多个端口从工作站转发到服务器。映射您必须在步骤#1和#2中配置的所有端口。如果您不这样做,则需要对所有上述端口进行非防火墙访问。

  4. 重新启动JVM并与JVisualVM连接。

答案 3 :(得分:1)

我尝试做类似的事情,但我不允许在服务器上安装JVisualVM。让JVisualVM连接到远程计算机似乎永远不会正常工作。我怀疑防火墙规则阻止了部分网络连接。 我发现远程配置服务器的唯一方法是通过ssh隧道。

  1. 在服务器上的CATALINA_OPTS中设置JMX端口

      

    CATALINA_OPTS =“$ CATALINA_OPTS -Dcom.sun.management.jmxremote.port = 13333 -Dcom.sun.management.jmxremote.authenticate = false -Dcom.sun.management.jmxremote.ssl = false; export CATALINA_OPTS

  2. 在桌面计算机上打开与服务器的ssh连接

      

    ssh -D 61444 username@tomcat.server.address

  3. 向JVisualVM添加一个标志,以便它代理其网络连接

      

    “C:\ Program Files \ Java \ jdk1.7.0_79 \ bin \ jvisualvm.exe”-J-Dnetbeans.system_socks_proxy = localhost:61444 -J-Djava.net.useSystemProxies = true

  4. 让JVisualVM连接到jmxport,网络流量通过ssh进行隧道传输。

    祝你好运。