java visualVM(jconsole)远程监控服务器java进程
JMX方式(jconsole也可通过此方式进行连接)
jmx方式能监控到CPU信息,但无法使用visualVM的visualVM GC插件
jmx无密码方式
监控普通的java进程
- 设置hostname
在/etc/hosts
中添加hostname
解析,解析地址可以不是外网ip
(可通过hostname命令查看hostname是多少) - 启动时添加参数
其中java -Djava.rmi.server.hostname=xxx.xxx.xxx -Dcom.sun.management.jmxremote.port=22334 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false Hello
xxx.xxx.xxx
为本机外网ip,22334
为提供jmx
访问的端口,可自己指定
如果没有配置hostname
解析可能会出现如下异常:Error: Exception thrown by the agent : java.net.MalformedURLException: Local host name unknown: java.net.UnknownHostException:
nohup java -Xms64m -Xmx128m -Djava.rmi.server.hostname=10.211.55.81 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=22334 -Dcom.sun.management.jmxremote.rmi.port=22335 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dserver.port=9091 -jar mybatisplus.jar 1>/dev/null 2>&1 &
- 在防火墙中开放端口
将查看上一步查看到的lsof -i | grep java | grep “启动的java进程pid”(可通过jps查看)
tcp
监听端口全部在防火墙中进行开放,注意关闭该java
进程后重新启动需要重新配置开发的端口,因为监听的端口会发生变化 - 打开
visualVm
或jconsole
输入ip
(2
中配置的xxx.xxx.xxx
)和端口(22334
)进行连接即可查看监控,无需输入用户名和密码
监控普通的tomcat
- 下载
catalina-jmx-remote.jar
,放在tomcat/lib
目录下面
请根据自己的tomcat版本选择对应的包:
地址示例:http://mirror.bit.edu.cn/apache/tomcat/tomcat-8/v8.5.35/bin/extras/
地址示例:http://archive.apache.org/dist/tomcat/tomcat-8/v8.5.35/bin/extras/
下载地址:http://mvnrepository.com/artifact/org.apache.tomcat/tomcat-catalina-jmx-remote
- 配置
conf/server.xml
在server.xml
中添加如下监听配置:
有了该可使得每次重启<Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener" rmiRegistryPortPlatform="22334" rmiServerPortPlatform="22334" />
tomat
不需要重新在防火墙中开放端口,因为会使用配置的22334
端口 - 修改
bin/catalina.sh
或bin/setenv.sh
添加配置:CATALINA_OPTS="${CATALINA_OPTS} -Djava.rmi.server.hostname=服务器的外网ip地址" CATALINA_OPTS="${CATALINA_OPTS} -Dcom.sun.management.jmxremote=true" CATALINA_OPTS="${CATALINA_OPTS} -Dcom.sun.management.jmxremote.ssl=false" CATALINA_OPTS="${CATALINA_OPTS} -Dcom.sun.management.jmxremote.authenticate=false"
- 在防火墙中开放端口
在防火墙中开发22334
端口firewall-cmd --zone=public --add-port=22334/tcp --permanent
- 打开
visualVm
或jconsole
输入ip
(3
中配置的服务器的外网ip
地址)和端口(22334
)进行连接即可查看监控,无需输入用户名和密码
jmx有密码方式
- 添加账号
进入/usr/java/jdk1.8.0_321-amd64/jre/lib/management/
目录(可通过jinfo pid|grep java.home
的查看自己的java.home
)
执行命令:cp jmxremote.password.template jmxremote.password chmod 600 jmxremote.password vim jmxremote.password # 将被注释的monitorRole,和controlRole放开,并修改密码123456 monitorRole 123456 controlRole 123456
或
进入/tomcat/conf/
目录vi jmxremote.access username readwrite vi jmxremote.password username password chmod 600 jmxremote.access chmod 600 jmxremote.password
- 修改之前的启动配置
#CATALINA_OPTS CATALINA_OPTS="$CATALINA_OPTS -Djava.awt.headless=true" CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote" CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.port=22334" CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.rmi.port=22335" CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.ssl=false" CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.authenticate=true" CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.password.file=../conf/jmxremote.password" CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.access.file=../conf/jmxremote.access" CATALINA_OPTS="$CATALINA_OPTS -Djava.rmi.server.hostname=10.211.55.81" export CATALINA_OPTS
或
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote" JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.port=8998" JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.rmi.port=8998" JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.ssl=false" JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.authenticate=ture" JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.password.file=../conf/jmxremote.password" JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.access.file=../conf/jmxremote.access" JAVA_OPTS="$JAVA_OPTS -Djava.rmi.server.hostname=10.211.55.81"
- 启动
打开visualVm
或jconsole
输入ip+端口
,然后输入之前设置的账号controlRole
和密码123456
即可连上
jstatd方式
jstatd方式能使用visualVM的visualVM GC插件,但无法监控到CPU信息
- 开启权限
在/usr/java/jdk1.8.0_321-amd64/jre/lib/security/java.policy
中添加permission java.security.AllPermission;
- 启动
rmiregistry 2020&jstatd -J-Djava.security.policy=all.policy -J-Djava.rmi.server.logCalls=true -J-Djava.rmi.server.hostname=服务器外网ip -p 1099
- 开放端口
通过netstat -ntlp|grep jstatd
查看监听的端口(注意有两个监听端口),在防火墙中进行开放该端口
如果出现:java.rmi.NotBoundException: JStatRemoteHost
一般等一段时间就恢复正常了 - 打开
visualVm
添加远程主机会自动加载远程java
进程
PS
- setenv.sh
vi setenv.sh chmod +x setenv.sh chmod 600 jmxremote.password chmod 600 jxmremote.access
java.rmi.server.ExportException: internal error: ObjID already in use
把文件server.xml
中的下面删除
即可。<Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener" rmiRegistryPortPlatform="8998" rmiServerPortPlatform="8999"/>
- Mac 下 java 的路径:
/usr/libexec/java_home -V
参考
visualVM使用jstatd和jmx连接远程jvm及遇到的问题解决
visualvm远程连接配置
visualvm 下载
visualvm 插件