三步排查服务器中Java应用CPU飙高
创始人
2024-09-26 17:54:20
0

文章目录

    • 启动一个Java应用模拟CPU飙高
    • top 命令查询CPU占用率高的Java应用
    • 分析该进程下占用CPU高的线程
    • 将线程PID转换为16进制
    • jstack 跟踪线程的调用栈
    • 查看源码

jstack 介绍
jstack 是 JDK 提供的一个命令行工具,用于生成 Java 进程的线程快照。
线程快照包含了 Java 进程中所有线程的状态信息,如线程的名称、线程的状态(RUNNABLE、WAITING、BLOCKED 等)以及线程的调用栈。
通过分析 jstack 生成的线程快照,可以帮助您诊断诸如死锁、线程阻塞、CPU 使用率过高等与线程相关的问题。

启动一个Java应用模拟CPU飙高

写了一个普通Java应用模拟CPU飙高,将它启动起来
在这里插入图片描述

top 命令查询CPU占用率高的Java应用

输入top 命令进入top命令界面后,按大写字母 P将根据CPU占用率排序, 按大写字母M将根据内存占用率排序

 top 

查找CPU占用高的进程,复制进程PID 我这里是 461655
在这里插入图片描述

分析该进程下占用CPU高的线程

top -Hp {PID} 命令查看进程下的线程

 top -Hp 461656 

查找CPU占用高的线程,复制线程程PID 我这里是 461656
在这里插入图片描述

将线程PID转换为16进制

使用 printf “0x%x” {PID} 命令转换16进制

 printf "0x%x" 461656 

转为16进制后 0x70b58
在这里插入图片描述

jstack 跟踪线程的调用栈

jstack 是JDK提供的命令行工具,如果你配置了环境变量可以不用写全路径,没有环境变量就要加上你的JDK路径

 # jstack 进程PID   # |grep 0x70b58 过滤出该线程相关调用栈信息  # -A 50 输出后50行   /usr/local/jdk1.8.0_301/bin/jstack 461655 |grep 0x70b58 -A 50 

以下输出调用栈中,可以看到在App.java中main方法第10行调用了线程就一直处于 java.lang.Thread.State: RUNNABLE 执行状态
在这里插入图片描述

查看源码

根据调用栈信息查看源码,原来代码中在计算圆周率后800万位。非常消耗CPU资源。

在这里插入图片描述

App.java 文件内容

package org.github.zuuyao;  import java.math.BigDecimal; import java.math.RoundingMode;  public class App {     public static void main(String[] args) {         System.out.println("calculatePi!");         // 计算圆周率精确到小数点八百万位         BigDecimal bigDecimal = calculatePi(8000000);         System.out.println("pi Value : " + bigDecimal.toString());     }       /**      * 模拟CPU飙高      */     public static void simulation() {         while (true) {             // 什么都不执行,一直死循环。占用大量CPU资源         }     }      /**      * 计算圆周率      *      * @param decimalPlaces 圆周率小数点位数      * @return 计算结果      */     public static BigDecimal calculatePi(int decimalPlaces) {          BigDecimal pi = BigDecimal.ZERO;         BigDecimal sixteen = BigDecimal.valueOf(16);         BigDecimal one = BigDecimal.ONE;          for (int k = 0; k <= decimalPlaces; k++) {             BigDecimal kBig = BigDecimal.valueOf(k);             BigDecimal term = one.divide(sixteen.pow(k), decimalPlaces + 10, RoundingMode.HALF_UP);             term = term.multiply(                 BigDecimal.valueOf(4)                     .divide(BigDecimal.valueOf(8 * k + 1), decimalPlaces + 10, RoundingMode.HALF_UP)                     .subtract(BigDecimal.valueOf(2)                         .divide(BigDecimal.valueOf(8 * k + 4), decimalPlaces + 10,                             RoundingMode.HALF_UP))                     .subtract(BigDecimal.valueOf(1)                         .divide(BigDecimal.valueOf(8 * k + 5), decimalPlaces + 10,                             RoundingMode.HALF_UP))                     .subtract(BigDecimal.valueOf(1)                         .divide(BigDecimal.valueOf(8 * k + 6), decimalPlaces + 10,                             RoundingMode.HALF_UP))             );              pi = pi.add(term);         }          return pi.setScale(decimalPlaces, RoundingMode.HALF_UP);     }   }  

pom.xml 文件内容

   4.0.0    org.github.zuuyao   troubleshooting-demo   1.0-SNAPSHOT   jar    troubleshooting-demo   http://maven.apache.org         UTF-8                    ${artifactId}                     org.apache.maven.plugins         maven-jar-plugin                                                true                              org.github.zuuyao.App                                                   

相关内容

热门资讯

安卓系统怎么注册Spotify... 你有没有想过,在安卓手机上听歌,怎么才能像在电脑上一样方便呢?没错,我要说的就是Spotify这个音...
安装安卓系统是什么,开启智能设... 你有没有想过,为什么你的手机总是那么卡,而别人的手机却流畅得像风一样?是不是觉得自己的手机被时代抛弃...
红米安卓哪个系统,深度解析红米... 你有没有想过,你的红米手机里那个安卓系统,它到底是个啥样子?是不是每次更新都让你觉得有点晕头转向?别...
导航安卓最新系统,导航功能革新... 你有没有发现,你的安卓手机最近是不是有点儿不一样了?是不是觉得操作起来更加流畅,界面也更加美观了呢?...
安卓系统就是骁龙系统吗,性能与... 你有没有想过,安卓系统和骁龙系统是不是一回事呢?是不是觉得这两个名字听起来有点像,所以它们可能就是同...
安卓系统怎样不更新系统,如何避... 你有没有想过,为什么有时候安卓系统的更新会让你头疼不已?是不是觉得每次更新后,手机变得又慢又卡,而且...
安卓系统怎么使用obs,并在录... 你有没有想过,用安卓系统玩转OBS(Open Broadcaster Software)直播或者录制...
安卓系统图标怎么变小,轻松实现... 手机屏幕越来越大,可图标却还是那么大,看着是不是有点不舒服呢?别急,今天就来教你怎么把安卓系统的图标...
安卓系统与ios系统互通吗,探... 你有没有想过,为什么你的安卓手机和朋友的iPhone总是不能无缝对接呢?今天,就让我带你一探究竟,揭...
安卓系统标志图案图片,系统标志... 你有没有注意到,每次打开安卓手机,那熟悉的标志图案就会出现在屏幕上,仿佛在向你招手呢?没错,就是那个...
obbo是安卓系统吗,安卓系统... 哦,你有没有听说过一个叫做Obbo的操作系统?是不是好奇它是不是安卓系统的一部分?今天,我们就来一探...
安卓系统壁纸带声音,安卓系统中... 你有没有想过,手机壁纸除了好看,还能有声音呢?是的,你没听错,就是那种安卓系统里的壁纸,竟然能带声音...
小米安卓原生系统体验,流畅与创... 亲爱的读者们,你是否厌倦了那些花哨却不够实用的手机系统?想要一次不一样的安卓体验吗?那就跟着我一起,...
电脑安卓系统如何恢复苹果系统,... 你是不是也和我一样,曾经因为各种原因,把安卓手机换成了苹果手机?结果,哎呀妈呀,数据丢失得让人心疼!...
安卓系统sd卡受损,原因分析及... 手机里的安卓系统突然告诉你SD卡受损了?别慌张,让我来给你详细说说这个棘手的问题,让你轻松应对!SD...
麒麟1.0系统兼容安卓,开启全... 你知道吗?最近科技圈可是炸开了锅,因为麒麟1.0系统宣布兼容安卓了!这可不是什么小道消息,而是实实在...
安卓系统mp0.900,功能升... 你有没有发现,最近你的安卓手机突然变得超级流畅,运行速度像是吃了加速丹一样?这可不只是错觉哦,因为安...
安卓充值哪个系统便宜,揭秘哪家... 你有没有想过,给安卓手机充值的时候,哪个系统最划算呢?是不是每次充值都感觉钱包在“瘦身”,但又不想错...
安卓系统手绘平板电脑,创新与便... 你有没有想过,在繁忙的生活中,找一款既能满足工作需求,又能让你尽情创作的平板电脑呢?今天,就让我带你...
安卓平板烧写系统,轻松升级与优... 你有没有遇到过安卓平板烧写系统的烦恼?别急,今天就来给你详细说说这个话题,让你一次性搞懂怎么解决安卓...