首页 > 编程语言 > 详细

【转】Java程序CPU飙升问题排查方法

时间:2019-08-26 08:19:02      阅读:91      评论:0      收藏:0      [点我收藏+]

windows环境下cpu飙升问题

线上某台runtime机器(windows Server)cpu报警,这种情况初步就是代码里面死循环了,先把机器下线了保证不再有新的任务分配进来,然而cpu使用依然不降这是正常的因为程序未结束死循环一直在运行。

  1. 找到java进程对应的pid。 
    找pid的方法是:打开任务管理器,然后点击 “查看” 菜单,然后点击 “选择列”,把pid勾上,然后就可以在任务管理器里面看到所有进程的pid值了。(也可以用第三步中提到的工具直接查看),windows10系统可以在详细信息直接查看 
    技术分享图片
  2. 把Java进程导出快照。

    jstack -l pid > c:/31372.stack

  3. 在windows下只能查看进程的cpu占用率,要查看线程的cpu占用率要借助其他的工具,可以使用微软提供的 Process Explorer(点击前往下载页面)

  4. 点击需要查看的进程右键properties 
    技术分享图片
  5. 然后选择 Threads 选项卡,找到占用cpu的线程的tid 
    技术分享图片
  6. 把pid转换成16进制,我这里直接用系统自带的计算器转换,置于为什么要转换,是因为先前用jstack导出的信息里面线程对应的tid是16进制的。 
    技术分享图片
  7. 然后在导出的进程文件里面搜7C84即可

linux环境下cpu飙升问题

    1. 使用如下命令找到最耗CPU的进程,然后再按一下 1,就会显示你服务器逻辑CPU的数量以及现在服务器CPU各个参数。占用最高的排在前面,我们可以看到占用高的ava进程

      top -c

    2. 找出占用高的Java线程,显示一个进程的线程运行信息列表,按一下P查看最高占用

      top -Hp pid

    3. 使用JVM自带的jstack命令导出当前所有线程的运行情况和线程当前状态,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题 

      jstack pid > error.log

    4. 目标线程pid转16进制

      printf “%x\n” pid

    5. 查找error.log中pid16进制转化后的位置

      grep pid error.log –color

【转】Java程序CPU飙升问题排查方法

原文:https://www.cnblogs.com/lyhero11/p/11408988.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!