1.交流:JStatD与JMX
VisualVM和JVM之间有两种通信方式:通过Java Management Extensions (JMX)协议或通过jstatd 。
jstatd
jstatd是与JDK一起分发的守护程序。 在目标计算机上从命令行启动它(可能需要以运行目标JVM的用户身份或以root用户身份运行它),VisualVM将与它联系以获取有关远程JVM的信息。
- 优点:可以连接到正在运行的JVM,无需使用特殊参数启动它
- 缺点:监视功能受到更多限制(例如,没有CPU使用率监视,无法运行Sampler和/或进行线程转储)。
例如:
bash> cat jstatd.all.policy
grant codebase 'file:${java.home}/../lib/tools.jar' {
permission java.security.AllPermission;
}
bash> sudo /path/to/JDK/bin/jstatd -J-Djava.security.policy=jstatd.all.policy
# You can specify port with -p number and get more info with -J-Djava.rmi.server.logCalls=true
注意:如果仅复制但未安装JDK,则将“ $ {java.home} /../ lib / tools.jar”替换为绝对的“ /path/to/jdk/lib/tools.jar”。
如果失败了
Could not create remote object
access denied (java.util.PropertyPermission java.rmi.server.ignoreSubClasses write)
java.security.AccessControlException: access denied (java.util.PropertyPermission java.rmi.server.ignoreSubClasses write)
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:374)
那么jstatd可能没有使用正确的java.security.policy文件启动(尝试提供其完全限定的路径)。
有关来自Oracle的VisualVM和jstatd的更多信息 。
JMX
- 优点:使用JMX将为您提供VisualVM的全部功能。
- 缺点:需要使用某些系统属性启动JVM。
启动目标JVM时,通常将需要使用以下属性(尽管您也可以启用SSL和/或要求用户名和密码):
yourJavaCommand... -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.port=1098
请参阅远程JMX连接 。
2.安全性:SSH
通过ssh连接到远程JMX或jstatd的最简单方法是使用SOCKS代理 ,它可以设置标准ssh客户端。
2.1使用SOCKS设置SSH隧道
ssh -v -D 9696 my_server.example.com
2.2配置VisualVM以使用代理
工具->选项->网络–手动代理设置–检查它并在本地主机和端口9696上配置SOCKS代理
2.3将VisualVM连接到目标
文件->添加远程主机…–键入远程计算机的IP或主机名JStatD连接
您应该在ssh窗口中都看到日志(由于其“ -v”, 例如: “ debug1:端口9696的连接转发到请求的socks端口0。 ”和“ debug1:通道3:free:direct-tcpip:为10.2.47.71端口1099侦听端口9696,从127.0.0.1端口61262,nchannels 6 “” 连接并在启动jstatd的控制台中(很多,例如“ FINER:RMI TCP Connection(23)-10.2.47.71 :… “)
添加远程主机后,请等待几分钟,然后您将看到JVM在其中运行。
可用状态:JVM参数,监视器:堆,类,线程监视(但不包括CPU)。 采样器和MBean需要JMX。
JMX
右键单击已添加的远程主机,然后选择“添加JMX连接...”,键入您选择的JMX端口。
您应该看到与jstatd类似的日志。
可用的统计信息:CPU使用率,系统属性,详细的线程报告(可访问堆栈跟踪),CPU采样(不支持内存采样)。
注意:采样器与分析器
VisualVM的采样器不包括在Object.wait和Thread.sleep(例如,等待I / O)中花费的时间。 如果您希望获得更多控制权或希望包括Object.wait和Thread.sleep时间,请使用NetBeans Profiler来对远程应用程序进行概要分析或采样。 它要求其Remote Pack(Java代理,即JAR文件)位于目标JVM中(NetBeans的附加向导可以在步骤4(手动集成)中为您生成远程包,并向您展示传递给目标的选项JVM使用它)。
您可以通过以下方式通过SSH运行探查器:转发其默认端口 (5140),并将其附加到本地主机上的转发端口(NetBeans版本7.1.1)。
别忘了分享!
参考: VisualVM: The Holy Java博客上来自JCG合作伙伴 Jakub Holy的通过SSH监视远程JVM(无论是否为JMX) 。
翻译自: https://www.javacodegeeks.com/2012/09/visualvm-monitoring-remote-jvm-over-ssh.html