• 分析java程序中cpu占用过高的线程


    收到服务器报警,服务端的一个java服务占用cpu200%多。该服务里面跑了很多线程,于是想找到是谁引起的
    1、首先dump出该进程的所有线程及状态
    使用命令 jstack PID 命令打印出CPU占用过高进程的线程栈.

    jstack -l 5683 > 5683.stack

    将进程id为5683的线程栈输出到了文件

    2、使用top命令找到耗cpu的线程
        使用top -H -p PID 命令查看对应进程是哪个线程占用CPU过高.

    [goocar@LoginSVR ~]$ top -H -p 5683
    top - 09:14:06 up 270 days, 18:33,  8 users,  load average: 7.94, 9.70, 10.31
    Tasks:  48 total,   2 running,  46 sleeping,   0 stopped,   0 zombie
    Cpu(s): 20.4% us, 30.5% sy,  0.0% ni, 43.8% id,  5.4% wa,  0.0% hi,  0.0% si
    Mem:  16625616k total, 16498560k used,   127056k free,    22020k buffers
    Swap: 16771820k total,  9362112k used,  7409708k free,  2224132k cached
    
      PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                
     5728 ecar    16   0 2442m 1.3g 288m R 38.3  8.4 208:06.62 java                                                                   
     5726 ecar    16   0 2442m 1.3g 288m S 37.3  8.4 209:08.91 java                                                                   
     5727 ecar    16   0 2442m 1.3g 288m R 37.3  8.4 213:14.04 java                                                                   
     5729 ecar    16   0 2442m 1.3g 288m S 35.6  8.4 211:39.23 java                                                                   
     5683 ecar    16   0 2442m 1.3g 288m S  0.0  8.4   0:00.00 java                                                                   
     5685 ecar    18   0 2442m 1.3g 288m S  0.0  8.4   0:01.62 java                                                                   
     5686 ecar    16   0 2442m 1.3g 288m S  0.0  8.4  21:13.33 java    

    可以看到是  5726 ~ 5729这4个线程占用的cpu比较高

    3. 将线程的pid 转成16进制,比如5729 = 0x1661
       到第一步dump出来的 5683.stack 里面找0x1661 就知道是哪个线程了

       "Server-3" prio=10 tid=0x6f1fc000 nid=0x1661 runnable [0x6d67f000]
       java.lang.Thread.State: RUNNABLE
        at sun.nio.ch.FileDispatcher.write0(Native Method)
        at sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:29)
        at sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:104)
        at sun.nio.ch.IOUtil.write(IOUtil.java:60)
        at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:334)
        - locked <0x77f3b3c0> (a java.lang.Object)
        at java.lang.Thread.run(Thread.java:619)

       经过查找,是服务线程比较忙,初步解决方法,就是加大服务线程数,重启,问题解决。

  • 相关阅读:
    Cocos游戏引擎,让小保安成就大梦想
    Android 高仿QQ5.2双向側滑菜单DrawerLayout实现源代码
    Java中字符串相等与大小比較
    Android四大基本组件之 Activity
    C++基础学习教程(五)
    HAWQ技术解析(八) —— 大表分区
    Jenkins 安装与使用--实例
    Android多点触控技术,实现对图片的放大缩小平移,惯性滑动等功能
    Mycat(4):消息表mysql数据库分表实践
    谋哥:《App自推广》开篇之回到远古人类
  • 原文地址:https://www.cnblogs.com/skyaccross/p/2829000.html
Copyright © 2020-2023  润新知