关于jvisualvm,jconsole的实践

2,057 阅读3分钟

jvm的监控还是要掌握一下的,因为jvm是核心,需要能够随时了解jvm的运行状态,包括线程,内存等,本地监控就不说了,主要是远程监控,还是有实际意义的

jvm提供了两种连接方式:

1、jmx连接

这个比较简单,在启动的时候加入一下参数,不管是tomcat启动还是java -jar启动都一样

-Djava.rmi.server.hostname=xx.xx.xx.xx -Dcom.sun.management.jmxremote.port=1111
-Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false

xx.xx.xx.xx是这台服务器的IP,1111是端口号,注意相关防火墙,安全组这些东西

然后启动之后 在你本地的jdk的安装包的bin下面,有个jvisualvm.exe,点击启动

右键远程连接,添加远程主机
输入IP

再右键,添加jmx连接

输入端口号,大功告成

补充:上述流程都做了之后还是连接不上可能存在的问题

In addition to listening to the port you specified (1100) the JMX server also listens to a randomly chosen (ephemeral) port.
Check, e.g. with lsof -i|grep java if you are on linux/osx, which ports the java process listens to and make sure your firewall is open for the ephemeral port as well.

除了JMX server指定的监听端口号外,JMXserver还会监听一到两个随机端口号, 可以通过命令: lsof -i|grep java |grep <pid>来查看当前java进程需要监听的随机端口号,

netstat -tupln |grep 1101
tcp        0      0 0.0.0.0:1101                0.0.0.0:*                   LISTEN      13997/java          
 lsof -i|grep 13997 
java      13997    root    9u  IPv4 132890      0t0  TCP *:37040 (LISTEN)
java      13997    root   70u  IPv4 132891      0t0  TCP *:pt2-discover (LISTEN)
java      13997    root   72u  IPv4 132892      0t0  TCP *:40085 (LISTEN)
java      13997    root   76u  IPv4 146976      0t0  TCP hotnamea:61618->10.88.146.205:49165 (ESTABLISHED)
java      13997    root   84u  IPv4 132904      0t0  TCP *:61618 (LISTEN)
java      13997    root   95u  IPv4 132936      0t0  TCP *:8163 (LISTEN)

把这些端口开放

【建议】因为随机短口号是Java进程启动后,OS随机分配给jmxserver的,如果可以关闭firewall就选择关闭,否则,需要每次在server就绪后,监测到随机端口号,并把它们配置到iptables中,置为开放状态。 【注意】每个Jmxserver还需要两个随机端口号。

2、jstatd连接

推荐用这个,为什么呢,因为它支持一个非常好用的插件,visualGC插件

工具>插件>可用插件>visualGC 安装好,如果是jmx连接,会如下显示

所以需要支持jstatd, 怎么办呢,首先,找到jdk的这个目录 jdk1.8.0_221/jre/lib/security,有个java.policy文件,编辑加上这句话

permission java.security.AllPermission;

网上许多是自己新建一个policy文件,然后加上这句话,也可以

然后在jdk的bin目录下,后台启动这个以下命令:

./jstatd -J-Djava.security.policy=xx/xx/java.policy -J-Djava.rmi.server.hostname=xx.xx.xx.xx &
-J-Djava.security.policy=后面的是文件的绝对路径
-J-Djava.rmi.server.logCalls=true 打开日志,如果客户端有连接过来的请求,可以监控到,便于排错
-J-Djava.rmi.server.hostname=192.168.36.6 指明本机hostname对应的本机地址,确保该地址可以给客户机访问. 因为有的服务器hostname对应的ip不一定是外网能连上的 .最好在这里直接明确指定
-p 1200 指定服务的端口号,默认是1099 .也是可选参数

然后大功告成,右键添加jstatd连接

一个默认一个定制,取决于你启动有没有指定端口,如果是默认端口,那么会自动建立连接,不需要额外操作

连接成功后,再看,内存使用情况一览无余

大功告成