【学习背景】
学习Java的小伙伴,应该对JVM有自己的一定了解,但是你有用过JDK自带的JVM的性能调优工具之一
jconsole
吗?不知道也没关系,本文将带你花几分钟快速了解如何使用jconsole对JVM进行监控,大家后续有时间可以自己动手学习下,特别是需要进行JVM性能优化的时候,个人觉得在工作中还是比较常用的。
进入正文~
学习目录
- 一、JDK说明
- 二、Windows运行jconsole
- 2.1 安装JDK
- 2.2 Windows运行jconsole
- 三、Linux配置远程
- 3.1 配置JDK
- 3.2 配置Tomcat
- 3.2.1 安装Tomcat
- 3.2.2 配置Tomcat远程
- 3.2.2.1 配置Tomcat远程(无密码)
- 3.2.2.2 配置Tomcat远程(有密码)
- 附录:如开启防火墙则需先放开端口
一、JDK说明
本文以
JDK1.8.202
为例,众所周知Oracle官方JDK从2019年4月16号开始商用收费,最后一个免费JDK版本是1.8.202
,JDK8历史版本下载地址:
https://www.oracle.com/java/technologies/javase/javase8-archive-downloads.html
下载不了的,也可以这里直接下载1.8.202
:
链接:https://pan.baidu.com/s/1sO1pEZIAV5fmRLRUuyXkKw 提取码:wrsx
官方公告:The Oracle JDK License has changed for releases starting April 16, 2019(即发布1.8.211 && 1.8.212两个收费版本)
二、Windows运行jconsole
2.1 安装JDK
官方下载并安装JDK1.8.202
或者直接下载.exe
链接:https://pan.baidu.com/s/1sO1pEZIAV5fmRLRUuyXkKw 提取码:wrsx
双击运行jdk-8u202-windows-x64.exe
傻瓜式一步一步往下安装即可,示例安装路径:
D:\Softwares\LearningSoftwares\JDK\jdk1.8.0_202\
2.2 Windows运行jconsole
双击JDK安装目录下的bin目录下的jconsole.exe
本地进程直接选中相关进程即可,这里本文以远程服务器指定开放的Tomcat远程端口号12345
为例进行连接,成功连接后就可以对JVM的内存进行监控,接下来进行Linux远程服务器Tomcat的相关配置
三、Linux配置远程
我这里以个人学习使用的Linux服务器是阿里云的CentOs 7.7为例,部署Tomcat并配置一个远程
12345
端口(只是用来做监控的端口,非实际Tomcat的应用端口号,如8080
),可以将Java工程部署到Tomcat下,也可以不用部署,因为Tomcat启动运行本身就是依赖JDK(或JRE),正常启动之后本身会占用的一个进程,后续就可以在Windows下通过JDK安装目录bin目录下的jconsole对Linux远程服务器的运行Tomcat进程来对JVM的内存进行监控,本文就先不部署应用了,主要启动Tomcat即可
3.1 配置JDK
已配置好JDK,可以跳过该步骤~
查看JDK版本:java -version
如果没有安装JDK,则需要先下载并安装好JDK
修改/etc/profile
配置并添加如下内容(需修改JDK实际路径):
export JAVA_HOME=/usr/java/jdk1.8.0_202
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
刷新配置生效:source /etc/profile
再次查看JDK:java -version
3.2 配置Tomcat
3.2.1 安装Tomcat
已配置Tomcat的可以跳过该步骤
没有安装Tomcat的,可以先到官方下载,再进行解压安装
https://archive.apache.org/dist/tomcat/tomcat-8/v8.0.24/bin/
我这里Tomcat解压并安装的示例路径如下:
mkdir -p /usr/tomcat/
cd /usr/tomcat/
tar -xvf apache-tomcat-8.0.24.tar.gz
cd /usr/tomcat/apache-tomcat-8.0.24
启动Tomcat
cd /usr/tomcat/apache-tomcat-8.0.24/bin
./startup.sh
查看Tomcat启动日志
tail -f /usr/tomcat/apache-tomcat-8.0.24/logs/catalina.out
查看Tomcat运行状态
ps -ef|grep tomcat
ps -ef|grep java
如果Tomcat正常启动,会出现如下相关进程
3.2.2 配置Tomcat远程
3.2.2.1 配置Tomcat远程(无密码)
无密码的很简单,直接修改Tomcat的bin目录下的catalina.sh
,在关键信息Execute The Requested Command
上面添加如下内容:
CATALINA_OPTS="$CATALINA_OPTS -Djava.rmi.server.hostname=192.168.xx.x -Dcom.sun.management.jmxremote"
CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.port=12345"
CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.rmi.port=12345"
CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.authenticate=false"
CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.ssl=false"
注意修改***hostname
为自己服务器的公网IP
,还有***jmxremote.rmi.port
这行不能少,少了会无法远程连接,网上很多这里都没配置。
网上有些地方发现catalina.sh中配置CATALINA_OPTS 不生效,于是想通过JAVA_OPTS
,如修改上面catalina.sh中为JAVA_OPTS:
JAVA_OPTS="$JAVA_OPTS -Djava.rmi.server.hostname=192.168.xx.x -Dcom.sun.management.jmxremote"
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.port=12345"
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.rmi.port=12345"
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.authenticate=false"
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.ssl=false"
能正常启动tomcat,但是这种会导致在执行shutdown.sh
停止tomcat时报错,原因是JAVA_OPTS
是任何命令的运行时选项,因此执行shutdown.sh
命令时会报错,提示端口(如12345
)被占用,而CATALINA_OPTS
则只会在"开始"时的选项,不会影响停止操作。
重启Tomcat
cd /usr/tomcat/apache-tomcat-8.0.24/bin
./shutdown.sh
./startup.sh
tail -f /usr/tomcat/apache-tomcat-8.0.24/logs/catalina.out
查看Tomcat进程
ps -ef|grep tomcat
看到Tomcat进程有远程hostname和port相关的信息,说明正常配置
Windows下重新进行远程连接,不用输入密码,直接连接即可
正常连接,可查看时间范围内的数据,可以对JVM的堆区内存进行监控,还可以监控线程数、类以及CPU使用率
3.2.2.2 配置Tomcat远程(有密码)
第一步:同样,修改catalina.sh内容
CATALINA_OPTS="$CATALINA_OPTS -Djava.rmi.server.hostname=192.168.xx.x -Dcom.sun.management.jmxremote"
CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.port=12345"
CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.rmi.port=12345"
CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.authenticate=true"
CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.ssl=false"
与无密码的区别在于,这里***authenticate
的值配置为true
,表示需要开启密码进行鉴权
第二步:配置远程用户密码
cd /usr/java/jdk1.8.0_202/jre/lib/management/
cp jmxremote.password.template jmxremote.password
chmod 600 jmxremote.password
修改jmxremote.password
,快捷键Shift + G
定位到最后,添加一个远程连接用户 用户密码
,如:
tomcat abc@123456
也可以放开现有的monitorRole/controlRole
两个用户的注解,用来做远程连接也可以
第三步:配置远程用户权限
同样,当前目录下,修改jmxremote.access
,快捷键Shift + G
定位到最后,给新加的tomcat用户读写的权限:
tomcat readwrite
保存:wq并退出
重启Tomcat
cd /usr/tomcat/apache-tomcat-8.0.24/bin
./shutdown.sh
./startup.sh
查看Tomcat
tail -f /usr/tomcat/apache-tomcat-8.0.24/logs/catalina.out
ps -ef|grep tomcat
启动无报错,并且查看tomcat进程也有如下看关键信息***authenticate=true
表明配置正常
Windows下重新进行远程连接,输入用户密码进行连接即可
正常连接,监听堆区内存、线程数、类以及CPU占用率如下:
附录:如开启防火墙则需先放开端口
本文使用的示例远程端口是12345
,如果服务器已开启防火墙,需要配置防火墙添加该端口,才可以正常远程连接
查看防火墙的状态
systemctl status firewalld.service
查看所有已添加端口
firewall-cmd --permanent --list-ports
或者,查看已添加的指定端口
firewall-cmd --query-port=12345/tcp
没有,则添加指定端口
firewall-cmd --permanent --add-port=12345/tcp
重启防火墙即可
systemctl restart firewalld.service