Linux下java进程CPU占用率高分析方法

在工作当中,肯定会遇到由代码所导致的高CPU耗用以及内存溢出的情况。这种情况发生时,我们怎么去找出原因并解决。

一般解决方法是通过top命令找出消耗资源高的线程id,利用strace命令查看该线程所有系统调用

 

方法一:

 

1.通过top命令查看当前系统CPU使用情况,找到可疑进程PID

 

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

  1. 找出消耗资源最高的线程

top -H -p 24138 可以不用第一步,直接执行命令 top -H ,就可以查看到消耗资源最高的线程

 

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

 

  1. 查看这个线程所有系统调用情况

strace -p 24167

可能没有重要信息

  1. 将需要的线程ID转换为16进制格式

printf “%x\n” 24167

73ef

  1. 最后打印线程的堆栈信息:

jstack 24167|grep 73ef -A 30

6、也可抓取堆栈信息,查看代码位置

jstack -F 24167 > dump.txt

通过这几步基本可以找出什么原因导致java进程占用那么高CPU资源。

 

方法二:

1. 通过 top 命令查看当前系统CPU使用情况,定位CPU使用率超过100%的进程ID;
2. 通过 ps aux | grep PID 命令进一步确定具体的线程信息;
3. 通过 ps -mp pid -o THREAD,tid,time 命令显示线程信息列表,然后找到耗时的线程ID;
4. 通过 strace -p tid 查看这个线程所有系统调用情况,可能没有重要信息
5. 将需要的线程ID转换为16进制格式:printf "%x\n" tid
6. 最后找到线程堆栈信息:jstack pid |grep tid ,其中tid是上面转换后的16进制的线程ID
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇