使用 VisualVM 分析 tomcat 个应用程序
Profiling tomcat application with VisualVM
我正在尝试 运行 用户名 tomcat6 下的 visualvm,因为显然 visualvm 只能在其用户名下找到应用程序 运行ning。所以默认情况下,它只会在我的用户名下查找应用程序 运行ning。我已经能够通过 jmx 将 visualvm 与 tomcat6 连接起来,但这缺乏检测分析的精细粒度。
我在用户名 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.access0(X11GraphicsEnvironment.java:65)
at sun.awt.X11GraphicsEnvironment.run(X11GraphicsEnvironment.java:115)
...
遗憾的是,在远程模式下只能进行采样,因此 JMX
将缺少检测工具。
实际上,您在 tomcat6
用户下 运行ning visualvm
的方法是正确的。你应该看看这个 question 如何在 sudo 下 运行 X11
应用程序。
传递 DISPLAY
和 XAUTHORITY
环境变量的最简单方法是使用 sudo -E
命令来保留当前用户环境。
此外,如果您在 tomcat6
用户下看不到您的进程,您应该检查 CATALINA_TMPDIR
是否指向 /tmp
。否则你应该把它传递给 visualvm
jvisualvm -J-Djava.io.tmpdir="${CATALINA_TMPDIR}"
最简单的方法是在 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版本需要相同或更新),File -> Add Remote Host -> 输入Host上的名字。它将为此主机创建一个条目。右键单击此条目 -> 添加 JMX 连接 -> 输入端口 -> 确定
jvisualvm 将能够远程访问您的应用程序。
如果需要,您还可以通过使用以下系统属性保护连接(您需要创建文件并将它们定位到您想要的位置:
-Dcom.sun.management.jmxremote.password.file=jmxremote.password
-Dcom.sun.management.jmxremote.access.file=jmxremote.access
这些属性需要添加到 CATALINA_OPTS 环境变量中。例如:
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
我尝试做类似的事情,但不允许我在服务器上安装 JVisualVM。让 JVisualVM 连接到远程机器似乎永远无法正常工作。我怀疑防火墙规则阻止了部分网络连接。
我发现远程分析服务器的唯一方法是通过 ssh 隧道。
在服务器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
在您的桌面计算机上打开到服务器的 ssh 连接
ssh -D 61444 username@tomcat.server.address
向 JVisualVM 添加一个标志,以便它代理其网络连接
"C:\Program Files\Java\jdk1.7.0_79\bin\jvisualvm.exe" -J-Dnetbeans.system_socks_proxy=localhost:61444 -J-Djava.net.useSystemProxies=true
让 JVisualVM 连接到 jmxport 并通过 ssh 传输网络流量。
祝你好运。
如果运行安装您的应用程序的计算机是远程的(如服务器),那么您无法运行 GUI 应用程序而不做一些工作。启用对 VisualVM
.
的远程访问可能会更容易
您可以使用两种技术连接到远程 JVM:使用 jstatd
或使用 JMX。我不确定您认为使用 JMX 会损失什么,但显然 jstatd
不允许您访问分析工具、CPU 监视器等)。
您需要配置 JVM 和 Tomcat 以允许远程访问。这需要 3 个步骤:
启用远程 JMX。原来,there's a guide for that.
修复用于 RMI 的 "wandering port"。还有一个guide for that。
(可选)安排对服务器的安全远程访问。最简单的方法是使用 ssh -Lport:localhost:port
和一系列 -L
参数将多个端口从您的工作站转发到您的服务器。映射您在步骤#1 和#2 中必须配置的所有端口。如果您不这样做,您将需要对所有上述端口进行非防火墙访问。
重新启动 JVM 并连接 JVisualVM。
我正在尝试 运行 用户名 tomcat6 下的 visualvm,因为显然 visualvm 只能在其用户名下找到应用程序 运行ning。所以默认情况下,它只会在我的用户名下查找应用程序 运行ning。我已经能够通过 jmx 将 visualvm 与 tomcat6 连接起来,但这缺乏检测分析的精细粒度。
我在用户名 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.access0(X11GraphicsEnvironment.java:65)
at sun.awt.X11GraphicsEnvironment.run(X11GraphicsEnvironment.java:115)
...
遗憾的是,在远程模式下只能进行采样,因此 JMX
将缺少检测工具。
实际上,您在 tomcat6
用户下 运行ning visualvm
的方法是正确的。你应该看看这个 question 如何在 sudo 下 运行 X11
应用程序。
传递 DISPLAY
和 XAUTHORITY
环境变量的最简单方法是使用 sudo -E
命令来保留当前用户环境。
此外,如果您在 tomcat6
用户下看不到您的进程,您应该检查 CATALINA_TMPDIR
是否指向 /tmp
。否则你应该把它传递给 visualvm
jvisualvm -J-Djava.io.tmpdir="${CATALINA_TMPDIR}"
最简单的方法是在 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版本需要相同或更新),File -> Add Remote Host -> 输入Host上的名字。它将为此主机创建一个条目。右键单击此条目 -> 添加 JMX 连接 -> 输入端口 -> 确定
jvisualvm 将能够远程访问您的应用程序。
如果需要,您还可以通过使用以下系统属性保护连接(您需要创建文件并将它们定位到您想要的位置:
-Dcom.sun.management.jmxremote.password.file=jmxremote.password
-Dcom.sun.management.jmxremote.access.file=jmxremote.access
这些属性需要添加到 CATALINA_OPTS 环境变量中。例如:
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
我尝试做类似的事情,但不允许我在服务器上安装 JVisualVM。让 JVisualVM 连接到远程机器似乎永远无法正常工作。我怀疑防火墙规则阻止了部分网络连接。 我发现远程分析服务器的唯一方法是通过 ssh 隧道。
在服务器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
在您的桌面计算机上打开到服务器的 ssh 连接
ssh -D 61444 username@tomcat.server.address
向 JVisualVM 添加一个标志,以便它代理其网络连接
"C:\Program Files\Java\jdk1.7.0_79\bin\jvisualvm.exe" -J-Dnetbeans.system_socks_proxy=localhost:61444 -J-Djava.net.useSystemProxies=true
让 JVisualVM 连接到 jmxport 并通过 ssh 传输网络流量。
祝你好运。
如果运行安装您的应用程序的计算机是远程的(如服务器),那么您无法运行 GUI 应用程序而不做一些工作。启用对 VisualVM
.
您可以使用两种技术连接到远程 JVM:使用 jstatd
或使用 JMX。我不确定您认为使用 JMX 会损失什么,但显然 jstatd
不允许您访问分析工具、CPU 监视器等)。
您需要配置 JVM 和 Tomcat 以允许远程访问。这需要 3 个步骤:
启用远程 JMX。原来,there's a guide for that.
修复用于 RMI 的 "wandering port"。还有一个guide for that。
(可选)安排对服务器的安全远程访问。最简单的方法是使用
ssh -Lport:localhost:port
和一系列-L
参数将多个端口从您的工作站转发到您的服务器。映射您在步骤#1 和#2 中必须配置的所有端口。如果您不这样做,您将需要对所有上述端口进行非防火墙访问。重新启动 JVM 并连接 JVisualVM。