1. top查看高负载的进程
查看进程
top
- top - 05:48:13 up 299 days, 21:59, 2 users, load average: 9.00, 8.99, 9.03
- Tasks: 78 total, 1 running, 77 sleeping, 0 stopped, 0 zombie
- Cpu(s): 3.4%us, 0.1%sy, 0.0%ni, 96.2%id, 0.3%wa, 0.0%hi, 0.0%si, 0.0%st
- Mem: 35062388k total, 34768556k used, 293832k free, 314468k buffers
-
Swap: 0k total, 0k used, 0k free, 27836352k cached
- PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
- 31327 root 20 0 7506m 4.8g 10m S 398.8 14.3 14580:05 java
查看线程
top -Hp 31327 (top -p 31327,再按shift+h)
- top - 05:52:15 up 299 days, 22:03, 2 users, load average: 9.07, 9.00, 9.04
- Tasks: 175 total, 9 running, 166 sleeping, 0 stopped, 0 zombie
- Cpu(s): 3.4%us, 0.1%sy, 0.0%ni, 96.2%id, 0.3%wa, 0.0%hi, 0.0%si, 0.0%st
- Mem: 35062388k total, 34768980k used, 293408k free, 314468k buffers
-
Swap: 0k total, 0k used, 0k free, 27836388k cached
- PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
- 31377 root 20 0 7506m 4.8g 10m R 49.5 14.3 1603:05 java
- 31387 root 20 0 7506m 4.8g 10m R 49.5 14.3 1639:41 java
- 31378 root 20 0 7506m 4.8g 10m R 45.5 14.3 1604:03 java
- 31381 root 20 0 7506m 4.8g 10m R 43.5 14.3 1614:25 java
- 31385 root 20 0 7506m 4.8g 10m R 43.5 14.3 1643:05 java
- 31389 root 20 0 7506m 4.8g 10m R 43.5 14.3 1605:30 java
- 31375 root 20 0 7506m 4.8g 10m R 41.5 14.3 1600:50 java
- 31376 root 20 0 7506m 4.8g 10m R 41.5 14.3 1602:16 java
- 22359 root 20 0 7506m 4.8g 10m R 39.6 14.3 1623:17 java
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. 线程状态
- Deadlock – 死锁
- Runnable – 执行中
- Suspended – 暂停
- Blocked – 阻塞
- Parked – 停止
- Waiting on condition – 等待资源
- Waiting on monitor entry – 等待获取监视器
- Object.wait() 或 TIMED_WAITING – 对象等待中