java程序cpu占用率高,分析具体线程

    今天将数据转发程序移植到LINUX服务器上,启动程序后,通过PP |grep java 发现程序占用了CPU固定在95%左右,并且一直没有下降,而是一直保持在这么一个高  度。顿时就慌了,关键第一次遇到类似的问题,并且感觉程序应该挺完善的。不应该出现这个问题。

  遇到问题就要进行解决,通过查找资料,借鉴前人经验,出现占用率这么高的状态主要原因有:  

    1.程序计算比较密集
          2.程序死循

                3.程序逻请求堵塞

  排查方案:

           (1). 首先dump出该程序进程的所有线程及其状

       通过命令:ps | grep java得到该程序的进程pid      

<pre name="code" class="plain">           ourgroup@iZ23gyf9teeZ:/home/zxf$ ps auwx |grep java
         ourgroup 23912  2.6  5.3 998908 54464 ?        Sl   14:45   8:31 java com.thingcom.mainServer.MainServer
         ourgroup 29226  0.7  7.7 1123176 79160 ?       Sl   Apr27  82:30 java org.huigher.server.Server
         ourgroup 29783  0.0  0.0  11744   900 pts/0    S+   20:04   0:00 grep java

 
 

     

                    使用命令jstack PID 重定向输出CPU占用过高的进程的线程栈。        

       ourgroup@iZ23gyf9teeZ:~/upload/thingcomSrv$ jstack 23912 > 23912.stack

   (2). 使用TOP命令得到实时线程占用量:

       使用top -H -p PID 命令查看对应进程是哪个线程占用CPU过高.

  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
23939 ourgroup  20   0  999936  55388  10968 R  0.7  5.5   2:19.62 java
23934 ourgroup  20   0  999936  55388  10968 R  0.3  5.5   2:19.32 java
23937 ourgroup  20   0  999936  55388  10968 R  0.3  5.5   2:19.64 java
23938 ourgroup  20   0  999936  55388  10968 R  0.3  5.5   2:19.63 java
23912 ourgroup  20   0  999936  55388  10968 S  0.0  5.5   0:00.00 java
23915 ourgroup  20   0  999936  55388  10968 S  0.0  5.5   0:00.78 java
23917 ourgroup  20   0  999936  55388  10968 S  0.0  5.5   0:00.46 java
23918 ourgroup  20   0  999936  55388  10968 S  0.0  5.5   0:00.00 java
23919 ourgroup  20   0  999936  55388  10968 S  0.0  5.5   0:00.00 java
23920 ourgroup  20   0  999936  55388  10968 S  0.0  5.5   0:00.00 java
23921 ourgroup  20   0  999936  55388  10968 S  0.0  5.5   0:00.32 java
23922 ourgroup  20   0  999936  55388  10968 S  0.0  5.5   0:00.24 java
23923 ourgroup  20   0  999936  55388  10968 S  0.0  5.5   0:00.00 java
23924 ourgroup  20   0  999936  55388  10968 S  0.0  5.5   0:08.15 java
23926 ourgroup  20   0  999936  55388  10968 S  0.0  5.5   0:00.00 java
23927 ourgroup  20   0  999936  55388  10968 S  0.0  5.5   0:00.14 java
23928 ourgroup  20   0  999936  55388  10968 S  0.0  5.5   0:00.16 java
23929 ourgroup  20   0  999936  55388  10968 S  0.0  5.5   0:00.23 java
23930 ourgroup  20   0  999936  55388  10968 S  0.0  5.5   0:00.20 java
23932 ourgroup  20   0  999936  55388  10968 S  0.0  5.5   0:00.00 java
23933 ourgroup  20   0  999936  55388  10968 S  0.0  5.5   1:09.98 java
23935 ourgroup  20   0  999936  55388  10968 S  0.0  5.5   1:03.29 java
23936 ourgroup  20   0  999936  55388  10968 S  0.0  5.5   0:00.14 java
23940 ourgroup  20   0  999936  55388  10968 S  0.0  5.5   1:02.99 java
29882 ourgroup  20   0  999936  55388  10968 S  0.0  5.5   0:00.00 java

                     这是我改过程序以后查看的结果,所以占用率不高,可以以PID:23934进行举例说明,如何查看具体某个进程

          (3).  将PID转换成十六进制:                   23934 =0x7d5e

         (4) .  进入最开始导入的32912进程的线程栈文件:23912.stack; 然后通过查找十六进制PID得到具体的某个进程,进行定位


   java.lang.Thread.State: TIMED_WAITING (sleeping)
        at java.lang.Thread.sleep(Native Method)
        at com.thingcom.netgate.NetgateAcceptDispatcherThread.run(NetgateAcceptDispatcherThread.java:38)
        at java.lang.Thread.run(Thread.java:722)


             通过定位发现原来是我在某个线程中,进入while语句后,判断语句为false,没有进行sleep。导致该线程一直占用cpu,所以导致了cpu占用率高的现象,该现象值得注意。
    

            主要借鉴大牛blog:       http://blog.csdn.net/huaishu/article/details/9219141

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值