ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Java应用线上cpu飙升排查

2022-07-04 01:01:57  阅读:148  来源: 互联网

标签:Java 50 id 排查 线程 进程 cpu


  1. 使用top命令实时地列出系统中的进程及其资源占用情况。
    PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND

当然也可以使用【top | grep java 】,筛选出所有的Java进程,达到快速定位的目的。

  1. 找到列表中cpu%列数值高的进程,表示它的cpu占用较高,记住它的进程id。

  2. 定位到进程后,还需要定位具体是哪个线程的问题。

ps -mp 14724 -o THREAD, tid, time # -mp选项表示过滤掉冗余信息
# top -p 14724 -H 能达到同样的目的

USER %CPU PRI SCNT WCHAN USER SYSTEM TID TIME
数据列表的第一行是本进程的资源占用总览,下面的每行代表一个线程,可以通过查看%cpu列,定位哪些线程cpu占用高。

  1. 上述命令列出的线程id是十进制的,由于jstack命令输出的线程id是十六进制的,所以需要将上一步的线程id转为十六进制。
 printf "%x\n" 14822

得到:39e6

  1. 查看Java线程的堆栈信息:
jstack 14724 | grep 39e6 -A 50  # 查看1427进程的堆栈信息,过滤出线程39e6的,最多显示50行(一般50行足以显示一个线程的状态了,不够可以加)

在目标线程的堆栈信息中,着重查看开头部分,其中的非标准库部分就是我们的业务代码,往往就是问题所在。

  1. cpu飙升原因

1.死循环,超大循环(例如:对5000万数据进行加工运算)
2.频繁地创建对象,导致频繁地发生youngGC,导致cpu居高不不下(例如:有人将100万json数据加载到jvm,转换为entity对象)
3.超大规模的浮点运算(例如:大规模3D运算,科学运算)
4.超量的线程数(例如:线程池设置了过高的线程容量,大量的线程调度切换cpu开销极大)

标签:Java,50,id,排查,线程,进程,cpu
来源: https://www.cnblogs.com/JaxYoun/p/16441446.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有