visualVM
visualVM是一个功能强大的jvm可视化工具,监控内存、cup、线程、GC等java程序运行时的详细信息,可安装多种插件。
下载地址:https://visualvm.github.io/download.html
远程监控
基于jstatd和jmx
服务器开启jstatd
jstatd基于RMI,提供了一个远程接口允许远程的监控工具连接到本地的JVM执行命令。
-J-Djava.rmi.server.hostname:
修改服务器域名映射,如果是127.0.0.1需修改为服务器公网ip
[root@phost ~]# vim /etc/hosts //将127.0.0.1修改为公网ip
47.94.121.121 localhost localhost.localdomain localhost4 localhost4.localdomain4
[root@phost ~]# hostname -i //查看hostname(不为127.0.0.1)
-J-Djava.rmi.server.logCalls=true:
使用日志
-J-Djava.security.policy:
指定安全策略
[root@phost ~]# cd /usr/local //进入任意目录
[root@phost ~]# vim jstatd.all.policy //创建.policy后缀的文件作为安全策略文件
.policy文件内容:
从jdk9开始,lib目录下无tools.jar文件
grant codebase "jrt:/jdk.jstatd" {
permission java.security.AllPermission;
};
grant codebase "jrt:/jdk.internal.jvmstat" {
permission java.security.AllPermission;
};
jdk8或之前的版本.policy文件内容:
grant codebase "$JAVA_HOME/lib/tools.jar" {
permission java.security.AllPermission;
};
修改后保存
最终指令
[root@phost ~]# nohup jstatd -J-Djava.rmi.server.hostname=47.94.121.121 -J-Djava.security.policy=/usr/local/jstatd.all.policy &
//hostname需改为服务器ip,nohup &后台运行
注
需开放端口,默认1099,如果是阿里云服务器需在安全组中放行端口
[root@phost ~]# lsof -i |grep jstatd //查看jstatd占用的端口
将查询出的相关端口在防火墙和阿里云安全组放行
配置JMX
JMX(Java Management Extensions)是一个为应用程序植入管理功能的框架。
找到catalina.sh所在目录:
[root@phost ~]# find / -name catalina.sh //根目录下按名称查找catalina.sh文件
find: ‘/proc/800885’: 没有那个文件或目录
/usr/local/tomcat/bin/catalina.sh
[root@phost ~]# vim /usr/local/tomcat/bin/catalina.sh //vim + 查询出的路径,修改catalina.sh内容
将以下运行参数加入到正文头部即可
JAVA_OPTS=' -Djava.rmi.server.hostname=47.94.121.121 -Dcom.sun.management.jmxremote.port=8888 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false '
-Djava.rmi.server.hostname:这个参数是服务器ip
-Dcom.sun.management.jmxremote.port: jmx远程连接时使用的端口,设置成任意未被占用的端口即可
Dcom.sun.management.jmxremote.ssl:是否使用ssl,ssl是一个通信加密的安全协议
-Dcom.sun.management.jmxremote.authenticate:是否需要身份认证,设置为false不需要用户名和密码
如果设置为true则需要额外配置以下2个参数
'-Dcom.sun.management.jmxremote.password.file=/usr/local/jmxremote.password -Dcom.sun.management.jmxremote.access.file=/usr/local/jmxremote.access'
Dcom.sun.management.jmxremote.access.file:access文件
[root@phost ~]# vim /usr/local/jmxremote.access //任意目录下创建access文件
ssss readwrite //格式为: 用户名 (空格)权限
Dcom.sun.management.jmxremote.access.file:密码文件
[root@phost ~]# vim /usr/local/jmxremote.password //创建密码文件
ssss 123456 //格式为: 用户名 (空格) 密码
在防火墙中将jmx端口放行
[root@phost ~]# lsof -i |grep java //查询java占用的端口,将查询到的 *:xx(LISTEN)端口进行放行
java 2959288 root 16u IPv6 388782439 0t0 TCP *:46485 (LISTEN)
远程连接
remote右键添加jmx连接,ok,大功告成,下图visual GC插件,可以看到堆详情和gc细节,大功告成