Jstack分析高负载的Java线程

废弥 于 2014-11-02 发布

1. top查看高负载的进程

查看进程

top

查看线程

top -Hp 31327 (top -p 31327,再按shift+h)

2. jstack 查看java 堆栈信息

直接打印

jstack 31327 grep -A 10 7a91 (线程16进制pid)

导出到文件

jstack 31327 > jstack_info.log

"http-bio-18080-exec-11" daemon prio=10 tid=0x00007f50b028e800 nid=0x5757 runnable [0x00007f50936eb000]
"http-bio-18080-exec-9" daemon prio=10 tid=0x00007f50b02a5000 nid=0x7a9d runnable [0x00007f512d6b5000]
"http-bio-18080-exec-8" daemon prio=10 tid=0x00007f50b02a3800 nid=0x7a9b runnable [0x00007f512d9e3000]
"http-bio-18080-exec-7" daemon prio=10 tid=0x00007f50b0011000 nid=0x7a99 runnable [0x00007f512dc88000]
"http-bio-18080-exec-5" daemon prio=10 tid=0x00007f50b000e000 nid=0x7a95 runnable [0x00007f512dd8a000]
"http-bio-18080-exec-4" daemon prio=10 tid=0x00007f50b000c000 nid=0x7a92 runnable [0x00007f512de0b000]
"http-bio-18080-exec-3" daemon prio=10 tid=0x00007f50b000a000 nid=0x7a91 runnable [0x00007f512de8c000]
"http-bio-18080-exec-2" daemon prio=10 tid=0x00007f50b0006800 nid=0x7a90 runnable [0x00007f512df0d000]
"http-bio-18080-exec-1" daemon prio=10 tid=0x00007f50b0005000 nid=0x7a8f runnable [0x00007f512ea67000]

可以看到这些线程都一直挂在程序的某一行,多半是这里发生了死锁

"http-bio-18080-exec-8" daemon prio=10 tid=0x00007f50b02a3800 nid=0x7a9b runnable [0x00007f512d9e3000]
   java.lang.Thread.State: RUNNABLE
		at java.util.HashMap.getEntry(HashMap.java:364)
		at java.util.HashMap.containsKey(HashMap.java:352)
		at com.xxx.xxx.dao.xxxHelper.getInfo(xxxHelper.java:108)

3. 然后去分析源代码

HashMap 是会出现死锁的,改为ConcurrentHashMap问题解决

4. 线程状态