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,点击启动
补充:上述流程都做了之后还是连接不上可能存在的问题
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连接,会如下显示
permission java.security.AllPermission;
网上许多是自己新建一个policy文件,然后加上这句话,也可以
./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连接