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 – 对象等待中