JAVA定位CPU占用率高

三世轮回 提交于 2019-12-18 05:25:21

一、top命令定位cpu占用率高的进程号(pid),找到pid后,top -p pid -H,记录出cpu占用率高的线程号(tid),用printf "%x\n" tid将其转换为16进制

二、使用jstack打印进程信息,为准确定位可以多来几次,jstack pid > pid_1.log

三、打开日志文件,找到十六进制的线程信息,可定位到具体类的某一行。

 

示例

1、

 1 Tasks: 546 total,   1 running, 544 sleeping,   0 stopped,   1 zombie
 2 Cpu(s): 15.3%us,  0.1%sy,  0.0%ni, 84.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
 3 Mem:  24633804k total, 23710152k used,   923652k free,   784472k buffers
 4 Swap: 32764556k total,   127120k used, 32637436k free,  7000668k cached
 5 
 6   PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                                                                                       
 7 25930 weblogic  18   0 5311m 4.5g  29m S 488.1 19.3  35663:17 java                                                                                                                                                                          
 8 16830 weblogic  15   0 13168 1472  824 R  0.7  0.0   0:00.04 top                                                                                                                                                                            
 9 13834 weblogic  16   0 13028 1424  812 S  0.3  0.0   5900:50 top                                                                                                                                                                            
10 17263 weblogic  23   0 2410m 1.5g  28m S  0.3  6.2 390:24.31 java                                                                                                                                                                           
11 17438 weblogic  25   0 3429m 1.7g  25m S  0.3  7.2 217:35.39 java                                                                                                                                                                           
12 26316 weblogic  23   0 4695m 2.5g  29m S  0.3 10.8  31:47.38 java                                                                                                                                                                           
13     1 root      15   0 10372  600  568 S  0.0  0.0   2:12.76 init                                                                                                                                                                           
14     2 root      RT  -5     0    0    0 S  0.0  0.0  22:18.89 migration/0                                                                                                                                                                    
15     3 root      34  19     0    0    0 S  0.0  0.0   2:38.19 ksoftirqd/0                                                                                                                                                                    
16     4 root      RT  -5     0    0    0 S  0.0  0.0   0:00.00 watchdog/0                                                                                                                                                                     
17     5 root      RT  -5     0    0    0 S  0.0  0.0  19:16.83 migration/1                                                                                                                                                                    
18     6 root      34  19     0    0    0 S  0.0  0.0   6:37.27 ksoftirqd/1                                                                                                                                                                    
19     7 root      RT  -5     0    0    0 S  0.0  0.0   0:00.00 watchdog/1                                                                                                                                                                     
20     8 root      RT  -5     0    0    0 S  0.0  0.0  11:11.42 migration/2                                                                                                                                                                    
21     9 root      34  19     0    0    0 S  0.0  0.0   6:59.29 ksoftirqd/2                                                                                                                                                                    
22    10 root      RT  -5     0    0    0 S  0.0  0.0   0:00.00 watchdog/2                                                                                                                                                                     
23    11 root      RT  -5     0    0    0 S  0.0  0.0   5:36.90 migration/3                                                                                                                                                              

进程号 为25930的java进程cpu使用率很高,top -p 25930  -H

 1 Tasks: 220 total,   1 running, 219 sleeping,   0 stopped,   0 zombie
 2 Cpu(s):  8.7%us,  0.1%sy,  0.0%ni, 91.2%id,  0.0%wa,  0.0%hi,  0.1%si,  0.0%st
 3 Mem:  24633804k total, 23712492k used,   921312k free,   784472k buffers
 4 Swap: 32764556k total,   127120k used, 32637436k free,  7000868k cached
 5 
 6   PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                                                                                       
 7 25960 weblogic  15   0 5311m 4.5g  29m S 51.9 19.3   5615:15 java                                                                                                                                                                           
 8 25941 weblogic  16   0 5311m 4.5g  29m S 15.0 19.3 798:46.36 java                                                                                                                                                                           
 9 25939 weblogic  15   0 5311m 4.5g  29m S 11.3 19.3 798:26.28 java                                                                                                                                                                           
10 25951 weblogic  15   0 5311m 4.5g  29m S 11.3 19.3 799:05.00 java                                                                                                                                                                           
11 25936 weblogic  15   0 5311m 4.5g  29m S 11.0 19.3 799:14.41 java                                                                                                                                                                           
12 25937 weblogic  15   0 5311m 4.5g  29m S 11.0 19.3 798:37.65 java                                                                                                                                                                           
13 25943 weblogic  15   0 5311m 4.5g  29m S 11.0 19.3 799:30.19 java                                                                                                                                                                           
14 25944 weblogic  15   0 5311m 4.5g  29m S 11.0 19.3 799:58.25 java                                                                                                                                                                           
15 25945 weblogic  15   0 5311m 4.5g  29m S 11.0 19.3 798:56.29 java                                                                                                                                                                           

tid为25960的线程cpu使用率很高。

1 [weblogic@shtpeb2b2eapp01 adminserver]$ printf "%x\n" 25960
2 6568

2、使用jstack打印进程信息并导入日志文件

jstack 25930 >25930_1.log

jstack 25930 >25930_2.log

jstack 25930 >25930_3.log

3、查看相关日志信息

 1 [weblogic@shtpeb2b2eapp01 bin]$ grep -A 10 0x6568 25930_1.log 
 2 "Concurrent Mark-Sweep GC Thread" prio=10 tid=0x0000000048b59000 nid=0x6568 runnable 
 3 "Gang worker#0 (Parallel CMS Threads)" prio=10 tid=0x0000000048b4f000 nid=0x6563 runnable 
 4 
 5 "Gang worker#1 (Parallel CMS Threads)" prio=10 tid=0x0000000048b51000 nid=0x6564 runnable 
 6 
 7 "Gang worker#2 (Parallel CMS Threads)" prio=10 tid=0x0000000048b53000 nid=0x6565 runnable 
 8 
 9 "Gang worker#3 (Parallel CMS Threads)" prio=10 tid=0x0000000048b54800 nid=0x6566 runnable 
10 
11 "Gang worker#4 (Parallel CMS Threads)" prio=10 tid=0x0000000048b56800 nid=0x6567 runnable 
12 
13 [weblogic@shtpeb2b2eapp01 bin]$ grep -A 10 0x6568 25930_2.log 
14 "Concurrent Mark-Sweep GC Thread" prio=10 tid=0x0000000048b59000 nid=0x6568 runnable 
15 "Gang worker#0 (Parallel CMS Threads)" prio=10 tid=0x0000000048b4f000 nid=0x6563 runnable 
16 
17 "Gang worker#1 (Parallel CMS Threads)" prio=10 tid=0x0000000048b51000 nid=0x6564 runnable 
18 
19 "Gang worker#2 (Parallel CMS Threads)" prio=10 tid=0x0000000048b53000 nid=0x6565 runnable 
20 
21 "Gang worker#3 (Parallel CMS Threads)" prio=10 tid=0x0000000048b54800 nid=0x6566 runnable 
22 
23 "Gang worker#4 (Parallel CMS Threads)" prio=10 tid=0x0000000048b56800 nid=0x6567 runnable 

从输出信息来看,此线程是JVM的GC线程,此时可以基本确定是内存不足或内存泄露导致gc线程持续运行,导致CPU占用过高。
所以接下来我们要找的内存方面的问题。

 1 [weblogic@shtpeb2b2eapp01 bin]$ jstat -gcutil 25930 2000 10
 2   S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT   
 3   0.00   0.00  94.78 100.00  87.22   1035   92.722 251436 158050.083 158142.805
 4   0.00   0.00  94.78 100.00  87.22   1035   92.722 251437 158050.083 158142.805
 5   0.00   0.00  94.78 100.00  87.22   1035   92.722 251438 158051.345 158144.067
 6   0.00   0.00  94.79 100.00  87.22   1035   92.722 251438 158052.279 158145.001
 7   0.00   0.00  94.79 100.00  87.22   1035   92.722 251439 158052.279 158145.001
 8   0.00   0.00  94.79 100.00  87.22   1035   92.722 251440 158053.553 158146.275
 9   0.00   0.00  94.79 100.00  87.22   1035   92.722 251440 158054.475 158147.197
10   0.00   0.00  94.79 100.00  87.22   1035   92.722 251441 158054.475 158147.197
11   0.00   0.00  94.79 100.00  87.22   1035   92.722 251441 158055.753 158148.475

从输出信息可以看出,Eden区内存占用95%,Old区内存占用100%,根据这些信息,基本可以确定是程序代码上出现了问题,可能存在不合理创建对象的地方。

使用文档编辑器打开日志

 

 发现大量的线程等待以及被锁住的资源,然后丢给相关开发同事

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!