线上环境JVM问题排查常用指令
线上和测试环境的JVM一般运行在linux服务器上,没有界面,遇到问题时需要用指令工具进行排查。这方面的学问博大精深,而且实战重于理论,这篇文章仅仅当作日常问题排查的笔记,方便自己查阅,各方面的细节网上有很多文章进行过深入探讨。
1. Tomcat配置
排查问题时不一定只围绕程序日志、linux系统性能指令和JDK工具,有时候看看程序部署的tomcat配置文件,也许会有帮助。
把${TOMCAT_DIR}当作程序运行的tomcat在线上环境安装的根目录。那么下面有几个常用配置文件可以供排查问题参考:
(1)${TOMCAT_DIR}/bin/catalina.sh
这个文件涉及JVM(JAVA_OPTS)和tomcat(CATALINA_OPTS)的启动参数、端口号等。另外还可以设置tomcat所使用的jdk版本。
(2)${TOMCAT_DIR}/bin/setclasspath.sh
这个文件一般涉及tomcat所使用的jdk版本。
(3)${TOMCAT_DIR}/bin/setenv.sh
这个文件一般涉及JVM的启动参数。
(4)${TOMCAT_DIR}/conf/server.xml
tomcat的基本配置文件。排查时主要看端口号配置是否冲突、connector协议、java程序读取的位置等。
2. linux指令
linux指令在排查时主要用于查JVM的进程id(pid)和线程id(也是pid,linux没有线程概念,线程和进程在linux里面的id都用pid表示,线程id可以后续配合jstack或者jps查出)。此外还用于查看服务器本身CPU、内存等使用情况。
(1)查进程id
ps -ef|grep -v|grep XXX
或者
ps aux|grep XXX
(2)查看服务器内存使用情况
free -m
(3)查看服务各程序的CPU、内存等指标
top
3. JDK工具
jdk工具主要用于在获取JVM的进程id后,对JVM进行细粒度的分析,比如堆栈、堆内存、线程等情况。
(1)查看JVM的线程id
jps -lv pid:jps只能查当前用户启动的JVM线程
或
jstack -l pid
(2)查看JVM堆栈情况
jstack -l pid
(3)查看JVM的堆内存
jmap -heap/-histo pid:注意jmap要是用全路径,也就是服务器里java安装路径下bin/jmap。因为jmap的jdk版本最好要和分析对象的jdk一致,而服务器一般装了多个jdk版本,所以显示指定jmap的路径是个好习惯。
(4)查看gc情况:
jstat [-命令选项] [pid] [间隔时间/毫秒] [查询次数]
比如:
jstat -class/-compiler/-gc/-gccapacity/-gcnew/-gcnewcapacity/-gcold/-gcoldcapactiy/-gcutil pid
这个命令的组合有很多,可以具体参考其他文章。