整体思路与流程:
1 先定位tomcat的线程
2 各种导出统计线程、进程信息
3 与开发一起查看
基础排查流程:
1 通过ps aux/top命令排查出tomcat有问题
2 通过top -Hp tomcatpid
3 通过jmap命令和jstack命令 导出与显示进程的信息并过滤线程信息
例如:
top -Hp 16983 #查看到17015线程占用较高
jstack 16983 #这个显示的线程是16进制的 需要转换一下
[root@localhost ~]# echo 'obase=16;17015'|bc
4277
[root@localhost ~]# jstack 16983|grep -A10 4277
"http-nio-8080-exec-5" #21 daemon prio=5 os_prio=0 tid=0x00007f71e47b8000 nid=0x4277 waiting on condition [0x00007f71b8961000]
java.lang.Thread.State: WAITING (parking) #主要是看这个状态 看是否是RUNNABLE或者是锁定状态
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x00000000e412a070> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:141)
at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:33)
at org.apache.tomcat.util.threads.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1114)
at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1176)
4 辅助手段tomcat日志
显示jvm内存使用信息: jmap -heap 16983
jvm内存内容导出:jmap -dump:format=b,file=/root/tomcat.bin 16983
需要使用windown中memoryanalyzer软件查看