1.使用top 定位到占用CPU高的进程PID

top

通过ps aux | grep PID命令

2.获取线程信息,并找到占用CPU高的线程

ps -mp pid -o THREAD,tid,time | sort -rn

3.将需要的线程ID转换为16进制格式

printf "%x\n" tid

4.打印线程的堆栈信息

jstack pid |grep tid -A 30

实际例子,可参考:https://blog.csdn.net/u010862794/article/details/78020231?locationNum=4&fps=1

简要

工作中负责的有一个项目是使用iReport+JasperReport实现的一个打印系统。最近这个线上程序经常无响应,重启后恢复正常,但是时不时还是会出现类似的问题。 
最后发现是JasperReport的一个问题。有个JasperReport的转换任务内存占用特别高,当新对象需要分配内存时就会内存不够了,于是GC线程就不断GC,占用CPU。 
导致系统CPU占用超高。 
下面说下问题排查的一个思路步骤

基本环境

  • tomcat 7
  • JDK 7
  • Linux

问题定位

查看后台异常

通过查看系统的后台日志,发现各个请求都正常,没有异常抛出。于是考虑系统状况

查看系统状况

top 命令查看CPU、内存等使用情况

[root@DEV-L002323 ~]# top
top - 14:52:54 up 514 days,  7:00,  8 users,  load average: 2.85, 1.35, 1.62
Tasks: 147 total,   1 running, 146 sleeping,   0 stopped,   0 zombie
Cpu(s): 57.6%us,  6.3%sy,  0.0%ni,  9.2%id, 26.2%wa,  0.0%hi,  0.0%si,  0.7%st
Mem:   3922928k total,  3794232k used,   128696k free,   403112k buffers
Swap:  4194296k total,    65388k used,  4128908k free,  1492204k cachedPID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                     6764 root      20   0 2428m 1.1g  11m S 190.0 28.3  36:38.55 java                                                                       1161 root      20   0     0    0    0 D  0.3  0.0  32:43.06 flush-253:0                                                                 1512 root      20   0 14684 4188  488 S  0.3  0.1   0:16.12 sec_agent                                                                   1 root      20   0 19356  652  436 S  0.0  0.0   0:16.64 init                                                                        2 root      20   0     0    0    0 S  0.0  0.0   0:00.05 kthreadd                                                                    3 root      RT   0     0    0    0 S  0.0  0.0   1:49.34 migration/0                                                                 4 root      20   0     0    0    0 S  0.0  0.0  17:46.61 ksoftirqd/0                                                                 5 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 migration/0                                                                 6 root      RT   0     0    0    0 S  0.0  0.0   2:02.78 watchdog/0                                                                  7 root      RT   0     0    0    0 S  0.0  0.0   1:46.79 migration/1

从top命令的结果发现。pid为6764的java进程CPU利用持续占用过高,达到了190%。内存占用率为28.3%。

定位问题线程

使用ps -mp pid -o THREAD,tid,time命令查看该进程的线程情况,发现该进程的两个线程占用率很高

[root@DEV-L002323 ~]# ps -mp 6764 -o THREAD,tid,time
USER     %CPU PRI SCNT WCHAN  USER SYSTEM   TID     TIME
root     71.7   -    - -         -      -     - 00:36:52
root      0.0  19    - futex_    -      -  6764 00:00:00
root      0.0  19    - poll_s    -      -  6765 00:00:01
root     44.6  19    - futex_    -      -  6766 00:23:32
root     44.6  19    - futex_    -      -  6767 00:23:32
root      1.2  19    - futex_    -      -  6768 00:00:38
root      0.0  19    - futex_    -      -  6769 00:00:00
root      0.0  19    - futex_    -      -  6770 00:00:01
root      0.0  19    - futex_    -      -  6771 00:00:00

从上面可以看出6766和6767两个线程占用CPU大约有半个小时,每个线程的CPU利用率约为45%。接下来需要查看对应线程的问题堆栈 
下面就看看6766这个问题线程的堆栈

查看问题线程堆栈

将线程id转换为16进制

[root@DEV-L002323 ~]#  printf "%x\n" 6766
1a6e

jstack查看线程堆栈信息

jstack命令打印线程堆栈信息,命令格式:jstack pid |grep tid

[root@DEV-L002323 ~]# jstack 6764 | grep 1a6e
"GC task thread#0 (ParallelGC)" prio=10 tid=0x00007ffeb8016800 nid=0x1a6e runnable
"GC task thread#0 (ParallelGC)" prio=10 tid=0x00007ffeb8016800 nid=0x1a6e runnable
"GC task thread#1 (ParallelGC)" prio=10 tid=0x00007ffeb8016800 nid=0x1a6e runnable
"VM Periodic Task Thread" prio=10 tid=0x00007ffeb8016800 nid=0x3700 waiting on condition JNI global references: 496

从上面可以看书,这些都是GC的线程。那么可以推断,很有可能就是内存不够导致GC不断执行。接下来我们就需要查看 
gc 内存的情况

jstat查看进程内存状况

[root@DEV-L002323 bin]# jstat -gcutil 6764 2000 10S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT   0.00   0.00  100.00 100.00  97.74   1863   33.937   310  453.788  487.7260.00   0.00  100.00 100.00  97.74   1863   33.937   310  453.788  487.7260.00   0.00  100.00 100.00  97.74   1863   33.937   310  453.788  487.7260.00   0.00  100.00 100.00  97.74   1863   33.937   310  453.788  487.7260.00   0.00  100.00 100.00  97.74   1863   33.937   310  453.788  487.7260.00   0.00  100.00 100.00  97.74   1863   33.937   310  453.788  487.7260.00   0.00  100.00 100.00  97.74   1863   33.937   310  453.788  487.7260.00   0.00  100.00 100.00  97.74   1863   33.937   310  453.788  487.7260.00   0.00  100.00 100.00  97.74   1863   33.937   310  453.788  487.7260.00   0.00  100.00 100.00  97.74   1863   33.937   310  453.788  487.726

可以看出内存的年轻代和年老带的利用率都达到了惊人的100%。FGC的次数也特别多,并且在不断飙升。可以推断出 
程序肯定是在哪里的实现有问题,需要重点查看大对象或者异常多的对象信息。此时可以生成headdump文件拿到本地来分析

jstack 和 jmap 分析进程堆栈和内存状况

使用jmap命令导出heapdump文件,然后拿到本地使用jvisualvm.exe分析。

命令: jmap [option] vmid 
jmap -dump:format=b,file=dump.bin 6764

命令: jstack [option] vmid 
jstack -l 6764 >> jstack.out

从heapdump文件中定位到程序中的工作现场,和内存状况,如下:

线程:

"Thread-21" daemon prio=5 tid=85 WAITINGat java.lang.Object.wait(Native Method)at java.lang.Object.wait(Object.java:503)at net.sf.jasperreports.engine.fill.AbstractThreadSubreportRunner.waitResult(AbstractThreadSubreportRunner.java:81)Local Variable: net.sf.jasperreports.engine.fill.ThreadExecutorSubreportRunner#2at net.sf.jasperreports.engine.fill.AbstractThreadSubreportRunner.start(AbstractThreadSubreportRunner.java:53)at net.sf.jasperreports.engine.fill.JRFillSubreport.prepare(JRFillSubreport.java:758)at net.sf.jasperreports.engine.fill.JRFillElementContainer.prepareElements(JRFillElementContainer.java:331)Local Variable: net.sf.jasperreports.engine.fill.JRFillSubreport#3at net.sf.jasperreports.engine.fill.JRFillBand.fill(JRFillBand.java:384)at net.sf.jasperreports.engine.fill.JRFillBand.fill(JRFillBand.java:358)at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillBandNoOverflow(JRVerticalFiller.java:458)Local Variable: net.sf.jasperreports.engine.fill.JRFillBand#3at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillPageHeader(JRVerticalFiller.java:421)at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillPageBreak(JRVerticalFiller.java:1954)at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillColumnBreak(JRVerticalFiller.java:1981)at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillDetail(JRVerticalFiller.java:754)Local Variable: net.sf.jasperreports.engine.fill.JRFillBand[]#1Local Variable: net.sf.jasperreports.engine.fill.JRFillBand#2at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReportStart(JRVerticalFiller.java:288)at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVerticalFiller.java:151)at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:939)at net.sf.jasperreports.engine.fill.JRFiller.fill(JRFiller.java:152)Local Variable: net.sf.jasperreports.engine.util.LocalJasperReportsContext#1Local Variable: net.sf.jasperreports.engine.fill.JRVerticalFiller#1at net.sf.jasperreports.engine.JasperFillManager.fill(JasperFillManager.java:464)at net.sf.jasperreports.engine.JasperFillManager.fill(JasperFillManager.java:300)Local Variable: java.io.File#135Local Variable: net.sf.jasperreports.engine.JasperFillManager#1Local Variable: net.sf.jasperreports.engine.JasperReport#1at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:757)at com.pingan.icore.print.asyntask.jasper.AysnJasPdfConvertorThread.fill(AysnJasPdfConvertorThread.java:110)Local Variable: java.lang.String#57815Local Variable: java.lang.String#55498Local Variable: java.util.HashMap#1682Local Variable: java.lang.String#57807Local Variable: java.lang.String#57809at com.pingan.icore.print.asyntask.jasper.AysnJasPdfConvertorThread.run(AysnJasPdfConvertorThread.java:223)Local Variable: java.io.File#139Local Variable: java.io.File#138Local Variable: java.io.File#137Local Variable: java.io.File#136Local Variable: com.pingan.icore.print.asyntask.jasper.AysnJasPdfConvertorThread#1at java.lang.Thread.run(Thread.java:722)

内存: 
发现这个net.sf.jasperreports.engine.fill.JRTemplatePrintText类的实例特别多,实例占了33.2%,大小占了58.1%

Java进程CPU使用率高排查相关推荐

  1. java进程cpu使用率高_什么会导致Java应用程序的CPU使用率飙升?

    问题 无限循环的while会导致CPU使用率飙升吗? 经常使用Young GC会导致CPU占用率飙升吗? 具有大量线程的应用程序的CPU使用率是否较高? CPU使用率高的应用程序的线程数是多少? 处于 ...

  2. java进程CPU占用高如何排查-案例二

    近期项目新版本上线遇到cpu冲高现象,依据之前的经验,把这次排查过程记录下. 这次排查参考了之前记录的经验,还是很有用的:java进程cpu占用高如何排查_停5s的博客-CSDN博客_java进程cp ...

  3. java进程cpu占用高如何排查

    问题: 公司参加HW期间,项目两台双活的jboss服务器频繁触发cpu利用率过高告警,cpu利用率长时间在90%以上. 排查思路: 第一步:在两台Linux服务器上,执行top命令,并按大写P以cpu ...

  4. Kafka CPU使用率高排查思路及解决方案

    一.CPU使用率高的一般排查思路 1) top命令排查CPU使用率高的进程 2) su - omm切换到omm用户,jstack -l 进程pid>>文件路径 3) top -H -p 进 ...

  5. java程序CPU使用率高可能的原因

    1. 前言 在Java并发编程方面,如何在多线程环境中设置合理的线程数,那我们需要了解两个概念: 计算密集型 要进行大量的计算.逻辑判断等操作,消耗CPU资源,比如计算圆周率.对视频进行高清解码等等, ...

  6. Java进程CPU占用高导致的网页请求超时的故障排查

    作者:荣书 来源:https://blog.51cto.com/rongshu/2426712 一.发现问题的系统检查: 一个管理平台门户网页进统计页面提示请求超时,随进服务器操作系统检查load a ...

  7. java进程CPU飙高

    早上某段时间突然看到看到一台生产机器上的CPU飙高 top 然后就请出了大神工具JVM 具体JVM的介绍看:http://www.cnblogs.com/smail-bao/p/6027756.htm ...

  8. 使用jstack定位应用服务器CPU使用率高的过程记录

    1.使用top查看CPU使用情况,发现用户为app的java进程CPU使用率近400%(4核CPU),记录下PID.(说明:系统恢复正常后的截图) 2.查看该进程中线程CPU使用率,使用top -Hp ...

  9. java事务占用内存吗,如何排查java应用中CPU使用率高或内存占用高的问题

    如何排查java应用中CPU使用率高或内存占用高的问题?这类问题的排查步骤基本通用的.现在通过一个具体的例子来说明. 问题描述 最近有个线上项目每天0点过后CPU使用率会上升至200%到300%. 排 ...

最新文章

  1. Java项目:干活管理系统(java+SSM+Jsp+Mysql)
  2. 【案例解析】 e家洁创始人:O2O创业的痛点与深坑
  3. 重拾C,一天一点点_3
  4. SpringMVC异常处理机制-异常处理两种方式
  5. @Resource,@Autowired,@Inject3种注入方式详解
  6. ios. GCD 倒计时时间
  7. mysql 数据操作,MySQL-数据操作
  8. Javascript异步操作的异常处理
  9. wpf 创建附加属性实例
  10. 浅析ReentrantLock重入锁
  11. 手机logging什么意思_手机三轴稳定器的“三轴”是什么意思?
  12. .NET单元测试(五):多线程
  13. 赛题解读 | 如何基于 Flink + AI 解决疫情防控难题?
  14. 白话区块链 之 14 - ​区块链的技术意义
  15. node 请求内网_Nodejs轻松搭建局域网服务器
  16. 怎样用ipad使用python_如何用iPad运行Python代码?
  17. idea光标移至行尾快捷键——End键不能移至行尾的解决办法
  18. linux io page fault,Linux的page fault
  19. 【任务二】打卡——by 003-Vamein
  20. MacOS High Sierra(10.13.6)上安装xcode10.2.1

热门文章

  1. 直接看见宇宙黑洞不是梦?最新天文研究表示有重大成果
  2. 2019年7月22日 学习日记
  3. 多人聊天功能代码php,PHP+swoole实现简单多人在线聊天群发效果
  4. 海明码(汉明码)详解
  5. 条码应用与企业ERP无缝集成
  6. ASP.NET教育管理系统源码【源码分享】
  7. CRM 建设方案(01):CRM基础
  8. CentOS7 安装ClamAV 进行病毒扫描查杀
  9. 施巍松老师组20-21年工作
  10. 快速打开电脑计算机的快捷键,电脑自带的计算器如何快速打开和快捷键的添加...