zoukankan      html  css  js  c++  java
  • [转]Java CPU 100% 排查技巧

    文章来源:微信公众号:猿天地

    平时多积累一点,这样在遇到问题的时候就少句求人的话。如果在实际的开发中遇到CPU 100%问题,要怎么排查呢?如果你没有遇到过这个问题,请先自己思考10s,如果你遇到过,这个时候也正好可以在回顾一遍。

    1. 使用top命令查看cpu占用资源较高的PID

      当前占用cup100% 的PID为3455。

    2. 通过jps找到当前用户下的java程序PID

      执行jps -l能够打印出所有的应用的PID,找到有一个PID和这个cpu使用100%一样的ID。

      这样就知道是哪一个项目服务存在问题了。知道了对应的服务,在接着后续的分析步骤。

    3. 使用 pidstat命令查找问题线程

      命令:pidstat -p < PID > 1 3 -u -t

      -p:指定进程号

      -u:默认的参数,显示各种进程的cup使用统计

      -t:显示选择任务的线程的统计信息外的额外信息

    4. 找到cpu占用较高的线程TID

      通过上图发现是 3467的TID占用cup较大

    5. 因为jstack命令输出文件记录的线程ID是16进制。

      因此我们先将TID转换为十六进制的表示方式,转换命令:printf "%x " 3467

      将3467转为十六进制 d8b,注意是小写,记录下来,后面会使用。

    6. 通过jstack -l PID输出当前进程的线程信息

      jstack -l PID /temp/test.log

      这个命令是把pid的堆栈信息直接打印到/temp/test.log文件里。-l是非必填参数。

      也可以直接搜索,命令:jstack PID  | grep d8b

      使用第二个命令会直接搜索到tid出现的信息,但缺少上下文不好定位。

      

    7. 查找 TID对应的线程(输出的线程id为十六进制)

      找到对应的代码,使用命令查找哦,不要肉眼比对,具体命令请思考,给你表现机会。

    找到之后具体分析这个线程在干什么,为什么会占用这么多的 CUP资源。

    PS:线程的几种状态如下说明:

      NEW,未启动的。不会出现在Dump中。

      RUNNABLE,在虚拟机内执行的。

      BLOCKED,受阻塞并等待监视器锁。

      WATING,无限期等待另一个线程执行特定操作。

      TIMED_WATING,有时限的等待另一个线程的特定操作。

      TERMINATED,已退出的。

  • 相关阅读:
    HDu 2830 Matrix Swapping II(dp)
    服务器http处理流程
    iOS网络缓存机制
    软件设计需要的两项能力:理解与抽象
    编程思想的本质
    编程思想:面向对象与面向过程
    You Can Customize Synthesized Instance Variable Names @property
    nil / Nil / NULL / NSNull VS objc_msgSend
    对OC中property的一点理解
    @property 的本质是什么?
  • 原文地址:https://www.cnblogs.com/huanshilang/p/11285816.html
Copyright © 2011-2022 走看看