01 前言

版权声明:本文为CSDN博主「Μr.ηobοdy」的原创文章
原文链接:https://blog.csdn.net/chenlixiao007/article/details/105999034

cpu是时分(time division)的,操作系统里有很多线程,每个线程的运行时间由cpu决定,cpu会分给每个线程一个时间片,时间片是一个很短的时间长度,如果在时间片内,线程一直占有,则是100%;我们应该意识到,cpu运行速度很快(主频非常高),除非密集型耗费cpu的运算,其它类型任务都会在小于时间片的时间内结束。

java cpu100%的排查步骤,基本都是一模一样的,只是命令稍有区别!步骤如下:

  1. 查找消耗cpu最高的进程PID
  2. 根据PID查出消耗cpu最高的线程号
  3. 根据线程号查出对应的java线程,进行处理。

02 Demo模拟

构造一个请求接口,模拟无限产生Person实例。
并进行接口调用:http://172.20.200.250:9563/demoService/demo/test?justDo=true

@RestController
@RequestMapping("demo")
public class DemoController {@GetMapping("test")public boolean test(@RequestParam boolean justDo) {List<Person> persons = new ArrayList<>();int i = 1;if (justDo) {while (true) {persons.add(new Person("张三", i));System.out.println(persons.size());}}return justDo;}
}

03 排查过程

1.使用top命令找出cpu占用最高的进程

2.使用ps -ef | grep java或者jps命令查看cpu占用高的进程是否为java进程:


3.使用top -H -p pid命令查询此进程的所有线程情况,发现主要有三个线程(PID为29871 29872 29873)占用cup高。-H表示以线程的维度展示,默认以进程维度展示。

4.使用命令jstack pid > pid.tdump将此进程的线程栈导出到文件并使用cat命令进行查看,pid.tdump文件后缀名随意,通常以tdump结尾。

jstack 29869 > 29869.tdump
cat 29869.tdump

5.将前一步骤查出的3个线程PID从十进制转为十六进制,因为java线程栈文件中的线程id是十六进制。对应分别为29871 -> 0x74af,,29872 -> 0x74b0,29873 -> 0x74b1。发现此3个线程中有2个为gc线程和1个工作线程。gc线程忙碌表示内存不够用了,要进行内存回收,可能是java内存回收不了,导致一直gc。

6.使用jstat -gcutil pid命令查看进程的堆情况,发现年轻代中Eden(伊甸园)和old代已使用的占当前容量百分比很高,并且GC频繁。

名字 解析
S0 年轻代中第一个survivor(幸存区)已使用的占当前容量百分比
S1 年轻代中第二个survivor(幸存区)已使用的占当前容量百分比
E 年轻代中Eden(伊甸园)已使用的占当前容量百分比
O old代已使用的占当前容量百分比
M 元数据区使用比例
CCS 压缩使用比例
YGC 从应用程序启动到采样时年轻代中gc次数
YGCT 从应用程序启动到采样时年轻代中gc所用时间(s)
FGC 从应用程序启动到采样时old代(全gc)gc次数
FGCT 从应用程序启动到采样时old代(全gc)gc所用时间(s)
GCT 从应用程序启动到采样时gc用的总时间(s)

7.使用jmap -dump:live,format=b,file=pid.hprof pid命令导出堆文件,只导出live的对象。文件后缀名可以是任意的,因为它也是二进制的,不过通常以hprof结尾。

8.使用JAVA_HOME/bin/jvisualvm.exe工具分析快照。载入快照(文件----->载入—>文件类型(堆)):

选择类列表,按照大小排序,找出占用内存最大的类别,发现是Person类。

至此,问题找到原因,原来是在死循环中,不断生产Person实例,并且无法回收,不仅工作线程一直占用cpu,而且导致gc线程忙碌进行回收内存,但是回收不了,最后导致内存不足java.lang.OutOfMemoryError

java的bin目录下有很多JVM性能调优监控工具jps、jstack、jmap、jhat、jstat、hprof。

CPU100% 问题排查相关推荐

  1. 一次线上服务CPU100%的排查过程

    前言 突然收到线上服务cpu达到100%的报警短信,于是立即展开排查. 排查过程 理论步骤 一.找到最耗CPU的进程 工具:top 方法: 执行top -c ,显示进程运行信息列表 键入P (大写p) ...

  2. springboot token_Springboot接口幂等性基于token实现方案

    什么是接口幂等 幂等(idempotent.idempotence)是一个数学与计算机学概念,常见于抽象代数中,即f(f(x)) = f(x).简单的来说就是一个操作多次执行产生的结果与一次执行产生的 ...

  3. 架构师之路17年精选80篇

    [架构必备] <互联网架构如何实现"高并发">4W+ <TCP接入层的负载均衡.高可用.扩展性架构设计>2.2W+ <配置中心架构设计演进>1. ...

  4. 服务器主体信息截图,puppeteer实现线上服务器任意区域截图

    整个九月份由于业务繁重以及玩心颇重,一直没有机会来写一篇博文.而且笔者于十月一日将会举办人生大事--婚礼,现在家里筹办过程中只能抽出零碎的时间来写这篇文章. 关于服务端截图,这种使用场景非常少见,大多 ...

  5. 【八股文】Linux篇

    目录 绝对路径用什么符号表示?当前目录.上层目录用什么表示?主目录用什么表示? 切换目录用什么命令? 怎么查看当前进程 ps是什么(快照状态,静态的) 基本参数 其他参数 ps显示的内容(默认显示) ...

  6. 阿里、百度、腾讯Java程序员面经(附带面试题答案)

    一定不要在没有面试经验的情况下先面大厂,或者是你想去的公司. 我是3月1日下午三点半在阿里的官网完善的简历,5点电话就过来了.作为一个java coder,阿里是个很好的平台,(当然C 的岗可以好好准 ...

  7. 2022年5月份面试题集合

    没回答上来或者回答的不够好的面试题集合 目录 Java Java基础 接口和抽象类的区别? 深拷贝和浅拷贝区别了解吗? Java集合 介绍一下HashMap? ArrayList的扩容机制是什么样的? ...

  8. Java学习专栏!全网最牛!

    Java基础系列 001:<快速深入理解JDK动态代理原理> 002:<这可能是你见过最全面的HashMap解读> 003:<我敢打赌你一定没用过 Java 中的这个类! ...

  9. 【这可能不只是一篇面经】- 有话想说的四个月

    原文链接:http://www.jianshu.com/p/a6ad23aee955?from=timeline&isappinstalled=0 写了个显眼的标题,就真得说几句有用的话. 5 ...

最新文章

  1. Oracle创建表管理表
  2. Tensorflow模型加载与保存、Tensorboard简单使用
  3. Python3 爬虫学习笔记 C14【验证码对抗系列 — 点触验证码】
  4. php 堵塞 消息队列,PHP的并发处理
  5. androidq获取文件正式路径_android Q 新特性
  6. gitlab搭建之互备模式
  7. linux7系统怎么启动ftp,CentOS 7上启动 vsftp报错解决一例
  8. EF/SQL/新闻中分页应用
  9. Grafana 系统可视化监控
  10. 【转】Java集合间的相互转换
  11. php 去除 css 格式,PHP清除html格式,去除html、css、js格式
  12. 神奇宝贝HTML游戏代码,《我的世界》神奇宝贝召唤神兽指令 各神兽召唤代码大全...
  13. xshell过期/安装教程
  14. python转html_Python 将文本转换成html的简单示例
  15. 读书笔记12 《新周刊485期 三商:智商、情商、时间商》
  16. 线程池java submit,详解线程池execute和submit用法
  17. 2021强网杯 ezmath writeup
  18. Spark 开发环境搭建(1)IDEA Gradle的安装部署、使用
  19. 2018年舆情产品小总结
  20. jquery.选择器

热门文章

  1. N次笑N次据说可以让人年轻10岁的故事
  2. 62套儿童行业响应式Html5儿童慈善机构网站模板儿童公益组织企业官网模板儿童慈善CSS模板下载婴儿树儿童健康食品整站模板html5网页静态模板Bootstrap扁平化网站源码css3手机seo自适响
  3. EightCap易汇:美元指数成分组成是什么?美元指数有什么作用?
  4. 基于Java+MySQL 实现(Web)动态人脸识别的认证识别系统【100010315】
  5. Boost电路连续、断续、空载状态分析与计算
  6. svn在idea中的使用
  7. 原生js-简易点名册实现
  8. svn服务器端下载linux,Svn linux服务端安装及配置
  9. Linux——从命令行配置网络、编辑网络配置文件
  10. 生物制药专业与计算机应用文献,生物制药技术专业求职信范文3篇