JVM虚拟机(十一)CPU飙高的排查方案与思路

目录

    • 一、排查方案与思路
    • 二、总结

一、排查方案与思路

1.一般我们查看 CPU 的使用情况,可以使用 TOP 命令:

top

执行结果如下所示,这里就可以按照 CPU 使用率进行排序。

在这里插入图片描述

2.通过 top 命令查看后,可以查看是哪一个 Java 进程占用 CPU 较高,上图所示的进程为:2266,CPU 的使用率是 90%,也就是接近占用了 1核的 CPU。

接下来,我们就需要定位到项目中具体是哪一行代码导致的这个问题。我们项目中这么多代码,该怎么排查呢?其实我们项目中的代码虽然多,但都是在线程中运行的,我们只需要找到对应的线程就能去定位这个问题了。

获取当前进程中的线程,我们可以使用如下命令:

ps H -eo pid,tid,%cpu | grep <pid>

执行结果如下所示:

这个执行结果中就展示了当前进程中所有线程占用 CPU 的情况了。可以看到,其中倒数第 2 个线程占用的 CPU 使用率比较高,这个就是我们要找的线程了。

然后我们还没有办法直接去查线程的情况,需要先使用之前介绍过的 jstack 命令来继续查看进程对应的线程情况:

jstack <pid>

执行之后,就会把当前进程对应的所有线程打印出来:

在这里插入图片描述

但是这么多线程,我们怎么才能找到具体是哪一个线程出了问题呢?我们还需要进一步地进行筛选。

刚才我们已经通过 ps 命令找到了 2276 线程消耗的 CPU 使用率比较高。这里面的 2276 是一个十进制的数字,我们使用 jstack 打印的线程ID 都是十六进程的,所以说我们需要进行一次转换:将十进制转换成十六进制。Linux 命令就可以支持,我们可以执行如下命令:

printf "%x\n" 2276

执行结果:

这样我们就得到了十六进制的线程ID,然后我们再根据 8e4 去刚才使用 jstack 命令打印的线程信息中进行查找:

在这里插入图片描述

找到对应的线程信息后,我们从线程信息中可以看出,在 Application.java 类中的第 9 行出现了问题。来到具体的代码中,我们可以看到:

代码中进行了一个死循环轮询,这就是导致 CPU 飙升的原因。


二、总结

CPU飙高的排查方案和思路:

  1. 通过 top 命令查看占用 cpu 的情况。
  2. 通过 top 命令查看后,可以查看是哪一个进程占用 cpu 较高。
  3. 使用 ps 命令查看进程中的线程信息。
  4. 使用 jstack 命令查看进程中哪些线程出现了问题,最终定位问题。

整理完毕,完结撒花~🌻

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/630714.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端三剑客 HTML+CSS+JavaScript ② HTML相关概念

他们这样形容我 是暴雨浇不灭的火 —— 24.4.18 学习目标 理解 HTML的概念 HTML的分类 HTML的关系 HTML的语义化 应用 HTML骨架格式 sublime基本使用 一、HTML初识 HTML指的是超文本标记语言&#xff0c;是用来描述网页的一种语言 超文本&#xff1a;暂且理解为“超级的文本”&…

安装importlib_resources库的方法最终解答!_Python库

安装Python库importlib_resources 我的环境&#xff1a;Window10&#xff0c;Python3.7&#xff0c;Anaconda3&#xff0c;Pycharm2023.1.3 importlib_resources importlib_resources是一个用于访问Python包中非代码资源&#xff08;如文本、图片等&#xff09;的库&#xff…

界面组件Telerik UI for WPF 2024 Q1新版亮点 - 全新DateRangePicker组件

Telerik UI for WPF拥有超过100个控件来创建美观、高性能的桌面应用程序&#xff0c;同时还能快速构建企业级办公WPF应用程序。UI for WPF支持MVVM、触摸等&#xff0c;创建的应用程序可靠且结构良好&#xff0c;非常容易维护&#xff0c;其直观的API将无缝地集成Visual Studio…

深入剖析Tomcat(三) 实现一个简易连接器

Tomcat中的servlet容器叫做Catalina&#xff0c;Catalina有两个主要模块&#xff1a;连接器与容器。在本章&#xff0c;将会建立一个连接器来增强第二章中应用程序的功能&#xff0c;用一种更好的方式来创建request与response对象。 截止文章编写日期&#xff0c;servlet规范已…

智能设备订购如何使药品供应链受益

自从 Covid-19 大流行扰乱全球供应链以来&#xff0c;制药行业对增强弹性的需求变得比以往任何时候都更加重要。药品供应链已经开始数字化转型&#xff0c;采用新技术有助于确保药品和关键物资按时到达目的地并支持长期业务战略。其中一种解决方案是在移动设备上进行智能设备订…

微信小程序开发笔记

微信小程序开发笔记 1 微信小程序的项目结构 2 页面组成 一个微信小程序是由一个或多个页面组成的&#xff0c;这些页面被存放在pages目录中。下面以pages 目录下的index页面为例展示其组成部分&#xff0c;index页面的组成部分如下图所示。 由上图可知&#xff0c;index页面…

Linux 磁盘管理和文件系统

硬盘的物理结构&#xff1a; 盘片硬盘有多个盘片&#xff0c;每盘片2面磁头每面一个磁头 硬盘的数据结构&#xff1a; 扇区盘片被分为多个扇形区域&#xff0c;扇区:每个扇区存放512字节的数据&#xff0c;硬盘的最小存储单位磁道同一盘片不同半径的同心圆&#xff0c;是由磁…

【Python系列】非异步方法调用异步方法

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

️️️Vue3+Element-Plus二次封装一个可定制化的table组件

前言 为什么需要二次封装 开发后台管理系统,会接触到很多表格和表单,一但表格表单多起来,仅仅只需要一小部分改变&#xff0c;都需要在中重写一大堆代码,许多重复逻辑,我们可以把重复逻辑抽离出来二次封装一个组件 使用,减少在开发中需要编写的代码。 为什么需要定制化 每个…

详解 C++ 实现K-means算法

一、K-means算法概述 K-means算法是一种非常经典的聚类算法,其主要目的是将数据点划分为K个集群,以使得每个数据点与其所属集群的中心点(质心)的平方距离之和最小。这种算法在数据挖掘、图像处理、模式识别等领域有着广泛的应用。 二、K-means算法的基本原理 K-means算法…

原来是这样的Three.js,我悟了

最近在b站上面看到up主&#xff1a;gamemcu的3D作品&#xff0c;着实让人感到非常震撼&#xff0c;作品中的SU7模型&#xff0c;利用的是Blender进行建模&#xff0c;利用了webGL的技术进行开发。由此启发了我对3D极大的乐趣。因此&#xff0c;凭借一点点&#x1f90f;的前端知…

3ds Max2024安装包(亲测可用)

目录 一、软件简介 二、软件下载 一、软件简介 3ds Max是一款基于PC系统的强大3D建模、渲染和制作软件&#xff0c;广泛应用于游戏开发、影视后期制作、建筑设计、工业设计等多个领域。其拥有丰富的建模工具&#xff0c;可轻松创建逼真的三维场景和模型&#xff1b;同时&#…