Linux下java進程CPU佔用率高分析方法(一)

Linux下java進程CPU佔用率高分析方法

在工做當中,確定會遇到由代碼所致使的高CPU耗用以及內存溢出的狀況。這種狀況發生時,咱們怎麼去找出緣由並解決。java

通常解決方法是經過top命令找出消耗資源高的線程id,利用strace命令查看該線程全部系統調用apache

1.經過top命令查看當前系統CPU使用狀況,找到可疑進程PIDspa

top - 09:37:18 up 70 days, 16:29,  2 users,  load average: 1.13, 1.04, 0.97
Tasks: 105 total,   1 running, 104 sleeping,   0 stopped,   0 zombie
Cpu(s):  1.0%us,  4.9%sy,  0.0%ni, 93.6%id,  0.0%wa,  0.0%hi,  0.0%si,  0.5%st
Mem:   2067816k total,  1756680k used,   311136k free,   236340k buffers
Swap:   524284k total,   255508k used,   268776k free,   277040k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
24138 apache    20   0 1273m 384m 3668 S 103.3 19.0   1232:39 java
 3359 root      39  19  2704   36    0 S  0.3  0.0   4:39.34 gam_server
 6696 root      20   0 34148 1604  244 S  0.3  0.1   5:06.63 httpd
19254 root      20   0  785m 221m 3176 S  0.3 11.0   9:04.36 java
    1 root      20   0  2224   28    0 S  0.0  0.0   1:22.46 init
    2 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kthreadd
    3 root      20   0     0    0    0 S  0.0  0.0   0:33.42 ksoftirqd/0
    5 root      20   0     0    0    0 S  0.0  0.0   0:00.03 kworker/u:0

從上面命令中能夠看出java進程CPU利用率一直保持100%,穩居不下,找到PID 24138線程

2. 找出消耗資源最高的線程code

top -H -p 24138 能夠不用第一步,直接執行命令 top -H ,就能夠查看到消耗資源最高的線程server

top - 09:49:49 up 70 days, 16:41,  2 users,  load average: 1.01, 1.04, 1.00
Tasks:  72 total,   1 running,  71 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.6%us,  1.3%sy,  0.0%ni, 97.7%id,  0.1%wa,  0.0%hi,  0.0%si,  0.2%st
Mem:   2067816k total,  1760840k used,   306976k free,   236744k buffers
Swap:   524284k total,   253344k used,   270940k free,   279092k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
24167 apache    20   0 1273m 384m 3688 R 99.1 19.0   1169:43 java
24152 apache    20   0 1273m 384m 3688 S  2.0 19.0   0:28.58 java
24188 apache    20   0 1273m 384m 3688 S  2.0 19.0   4:56.69 java
24138 apache    20   0 1273m 384m 3688 S  0.0 19.0   0:00.00 java

3. 查看這個線程全部系統調用狀況blog

strace -p 24167
可能沒有重要信息

4. 將須要的線程ID轉換爲16進制格式進程

printf "%x\n" 24167
73ef

5. 最後打印線程的堆棧信息:內存

jstack 24167|grep 73ef -A 30 

六、也可抓取堆棧信息,查看代碼位置資源

jstack -F 24167 > dump.txt

經過這幾步基本能夠找出什麼緣由致使java進程佔用那麼高CPU資源。

相關文章
相關標籤/搜索