查找占用cpu过高的线程,并排查原因
1、查找jvm进程
(1)jps -l
(2)ps -ef|grep java
这一步骤可以得到进程号,假如进程号为9527
2、查找该jvm进程中占用cpu比较高的线程
(1)top -Hp 9527
这一步可以得到一批线程号,根据使用率从高到低排序,找到使用率最高的那个,假如线程号为3366110
(2)printf "%x\n" 3366110
将此线程号转成16进制,结果为:335cde
3、从stack信息中找到335cde所对应的线程及内容
(1)jstack -l 9527 | grep -C 5 335cde
-l 可以查看线程中的锁的附加信息,也可以不加-l
9527为pid
grep -C 5 549d为输出《335cde》前后5行
335cde为16进制的线程编号
4、分析335cde所对应的内容,一般很容易定位到代码,并找到原因
注:第三步也可以改为 -> 导出stack信息,然后查找335cde
jstack pid > jstack4756jis
从jstack4756jis这个文件中查找335cde,即可找到消耗资源最高的线程执行的程序
如果jstack pid卡住了,可以使用jstack -F pid 强行输入
导出堆信息进行排查
jmap获取堆信息
jmap -dump:format=b,file=fileName.hprof pid
查看内存回收情况
jstat -gcutil pid
jconsole、jvisualvm连接远程服务,服务端的配置
1、修改catalina.sh信息,添加以下
JAVA_OPTS="$JAVA_OPTS -Djava.rmi.server.hostname=47.107.80.230 -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=true"
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.ssl=false"
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.access.file=/hzx/installsoftware/java/jdk1.8.0_192/jre/lib/management/jmxremote.access"
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.pwd.file=/hzx/installsoftware/java/jdk1.8.0_192/jre/lib/management/jmxremote.password"
2、修改用户jdk安装目录jre/lib/management下jmxremote.access和jmxremote.password信息
jmxremote.access添加以下信息
admin readonly
root readwrite
create javax.management.monitor.,javax.management.timer.
jmxremote.password添加以下信息
monitorRole 12345678 //用户名:monitorRole,这个名字系统是预先设置好的
admin 123456 //自定义了用户名:admin
root 123456 //自定义了用户名:root