java 线上高占用cpu调优

1.使用 top 查看cpu占用情况

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND                                                                              
32423 root      20   0 2160292 125968  16692 S  13.6  15.0   0:30.92 java                                                                                 
 1766 root      20   0  159824   2140   1552 S   1.0   0.3   1:44.98 sshd                                                                                 
 4773 systemd+  20   0 1354560  49724  10208 S   1.0   5.9   1:13.72 mysqld                                                                               
32715 root      20   0   64076   4708   3952 R   0.7   0.6   0:00.10 top                                                                                  
  771 root      16  -4   47844     24      0 S   0.3   0.0   0:03.66 sedispatch                                                                           
  910 root      20   0    9768   2716   2408 S   0.3   0.3   0:00.01 bash                                                                                 
 1996 root      20   0   64796   1664    464 S   0.3   0.2   1:11.67 top                                                                                  
31165 root      20   0       0      0      0 I   0.3   0.0   0:00.04 kworker/0:2-ata_sff                                                                  
    1 root      20   0  180868   4384   2952 S   0.0   0.5   0:05.26 systemd                                                                              
    2 root      20   0       0      0      0 S   0.0   0.0   0:00.00 kthreadd                                                                             
    3 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 rcu_gp 

可以看到我们占用最高的pid是32423
2.然后输入 top -Hp 32423 查看 详细进程

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND                                                                              
 3643 root      20   0 2160292 128484  16692 R  85.1  15.3   1:03.22 java                                                                                 
32425 root      20   0 2160292 128484  16692 S   1.0  15.3   0:02.22 java                                                                                 
32423 root      20   0 2160292 128484  16692 S   0.0  15.3   0:00.00 java                                                                                 
32424 root      20   0 2160292 128484  16692 S   0.0  15.3   0:11.50 java                                                                                 
32426 root      20   0 2160292 128484  16692 S   0.0  15.3   0:00.04 java                                                                                 
32427 root      20   0 2160292 128484  16692 S   0.0  15.3   0:00.06 java                                                                                 
32428 root      20   0 2160292 128484  16692 S   0.0  15.3   0:00.00 java                                                                                 
32429 root      20   0 2160292 128484  16692 S   0.0  15.3   0:15.96 java                                                                                 
32430 root      20   0 2160292 128484  16692 S   0.0  15.3   0:03.47 java                                                                                 
32431 root      20   0 2160292 128484  16692 S   0.0  15.3   0:00.00 java                                                                                 
32432 root      20   0 2160292 128484  16692 S   0.0  15.3   0:00.11 java 

可以看到我们占用最高的3643

  1. printf("$x\n") 3643 来查看该进程的16进制, 然后再使用jstack -l 32423 |grep e3b -C 20 定位出问题点
[root@10 testapp]# printf "%x\n" 3643
e3b
[root@10 testapp]# jstack -l 32423 |grep e3b -C 20
2020-08-17 13:28:15
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.261-b12 mixed mode):

"Attach Listener" #31 daemon prio=9 os_prio=0 tid=0x00007f3408004800 nid=0x3c82 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
        - None

"Thread-2" #30 daemon prio=5 os_prio=0 tid=0x00007f342c29d800 nid=0xe3b runnable [0x00007f33ff7fa000]
   java.lang.Thread.State: RUNNABLE
        at java.io.FileOutputStream.writeBytes(Native Method)
        at java.io.FileOutputStream.write(FileOutputStream.java:326)
        at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82)
        at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140)
        - locked <0x00000000f77a25e0> (a java.io.BufferedOutputStream)
        at java.io.PrintStream.write(PrintStream.java:482)
        - locked <0x00000000f7785748> (a java.io.PrintStream)
        at sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:221)
        at sun.nio.cs.StreamEncoder.implFlushBuffer(StreamEncoder.java:291)
        at sun.nio.cs.StreamEncoder.flushBuffer(StreamEncoder.java:104)
        - locked <0x00000000f7785730> (a java.io.OutputStreamWriter)
        at java.io.OutputStreamWriter.flushBuffer(OutputStreamWriter.java:185)
        at java.io.PrintStream.newLine(PrintStream.java:546)
        - eliminated <0x00000000f7785748> (a java.io.PrintStream)
        at java.io.PrintStream.println(PrintStream.java:807)
        - locked <0x00000000f7785748> (a java.io.PrintStream)
        at com.example.shirodemo.controller.TestController$Worker.run(TestController.java:34)
        at java.lang.Thread.run(Thread.java:748)

4.可以看出是testcontroller的run方法出现问题,且大约在34行.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值