开启jmx监控
先关闭tomcat服务
/app/tomcat/bin/shutdown.sh
编辑bin目录下catalina.sh文件在119行添加一下内容:
CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8888 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=192.168.8.19 -Dcom.sun.management.jmxremote.rmi.port=8888"
注:tomcat8.5版本以后需要写在一行,否者无法正常开启
查看一下8888端口是否已经开启
除了指定的8888端口以外还会生成两个随机的端口,如果你是在云服务器上部署的话必须配置放行策略。
接下来在Windows打开jconsole(安装了jdk的情况下),一般在C:\Program Files\Java\jdk1.8.0_202\bin\jconsole.exe
选择不安全的连接
可以看到如下信息
还有一个工具是jvisualVM,我的在C:\Program Files\Java\jdk1.8.0_202\bin\jvisualvm.exe
tomcat常见故障及排查
- tomcat随机启动故障
在/etc/rc.d/rc.local下明明添加了/app/tomcat/bin/startup.sh但是下次开机的时候发现tomcat没有起来,查看日志:
发现线程被destroy掉了,原因是当初安装jdk的时候采用二进制的方式安装导致有些环境变量tomcat无法匹配到导致的,只需在/etc/rc.d/rc.local添加多一条. /etc/profile
即可。
- tomcat运行占用大量swap内存而物理内存占用较少
遇到该原因可能有以下两方面的原因造成的:
1.开发写的代码有bug
2.没有优化linux内核参数vm.swappiness=0
(是否优先使用物理内存,值越小越优先)
- tomcat负载过高
排查流程:
- 使用vmstat、top、ps aux找出那个进程导致的问题
- 通过top -Hp javaPID找出是哪个java线程的问题
- 将有问题的线程ID转换为16进制。echo ‘obase=16;ThreadID’|bc
- 使用jstack命令显示java进程信息。jstack 进程ID|grep -i -A 10
- 使用jmap命令显示java jvm信息。jmap -heap javaPID
- 导出jvm内存的内容。jmap -dump:format=b,file=/root/tomcat.bin PID
- 导出来之后使用mat工具进行分析:
我相信大多数人还是能看懂的,如果不相信的话那就要找开发人员一起分析了。