使用top +jps+jstack定位cpu占用100%的Java服务问题定位简易操作指引

1. 使用top命令找出CPU占用最多的应用

首先,你需要使用top命令来识别哪个进程正在使用大量的CPU资源。

  • 运行top命令:
  • 在终端中输入top并按下回车键。
  • 查看CPU使用率最高的进程:
  • 默认情况下,top会按CPU使用率排序。查看%CPU列,找出使用率最高的进程。
  • 识别Java进程:
  • 如果发现CPU使用率最高的是Java进程(在COMMAND列显示为java),记下它的PID。

2. 使用jpsjstack获取Java进程的线程堆栈跟踪

接下来,使用jps命令来确认Java进程的ID,然后用jstack来获取线程的堆栈跟踪。

  • 使用jps定位Java进程:
    • 运行jps -l以列出所有Java进程及其主类的全限定名。这有助于确认你在top中看到的Java进程。
  • 使用jstack获取线程堆栈:
    • 对于每个可疑的Java进程,使用jstack加进程ID来获取线程堆栈跟踪:jstack <PID>。这将输出所有线程的当前调用堆栈。

3. 分析堆栈跟踪

通过分析jstack输出的堆栈跟踪,你可以尝试找到CPU使用率高的线程。这里有些指标可以帮助你:

  • 查找状态为RUNNABLE的线程,因为它们是实际在CPU上运行的线程。
  • 检查这些线程的堆栈跟踪,寻找正在执行的方法和代码行。
  • 注意看是否有特定的方法或循环被频繁调用,这可能是CPU使用率高的原因。

示例分析

假设你运行了jstack,得到了类似以下的输出片段:

"Thread-1" #10 prio=5 os_prio=0 tid=0x00007f2a5400e800 nid=0x6e03 runnable [0x00007f2a4d9fa000]java.lang.Thread.State: RUNNABLEat MyAppPackage.MyBusyClass.busyMethod(MyBusyClass.java:50)at MyAppPackage.MyBusyClass.run(MyBusyClass.java:35)at java.lang.Thread.run(Thread.java:748)

这是一个示例堆栈跟踪,其中关键信息包括:

  • 线程状态 (java.lang.Thread.State): RUNNABLE表明该线程正在Java虚拟机中执行,是一个活跃运行的线程。
  • 执行的方法和代码行: MyBusyClass.busyMethodMyBusyClass.java:50。这是线程正在执行的方法,如果这行代码或方法在多个堆栈跟踪中反复出现,可能表明它是CPU使用率高的原因。

通过查找此类模式,你可以识别出可能导致CPU使用率高的线程和代码段。

4. 进行代码级分析

一旦你发现了可能导致高CPU使用的线程和方法,你就需要查看相应的源代码。在代码中寻找如下问题:

  • 无限循环或高效率循环。
  • 性能低下的算法。
  • 大量的同步操作或死锁。
  • 不必要的资源密集型操作。

5. 修改代码

===============================================================

附录:

Top命令 主要输出指标的解释:

  • PID: 进程标识符,用于唯一标识系统中的每个进程。
  • COMMAND: 正在执行的命令的名称,这里是java。
  • %CPU: 此进程使用的CPU百分比。
  • TIME: 此进程累积占用的CPU时间。
  • #TH: 进程使用的线程数
  • #WQ: 在等待队列中的线程数量。
  • #POR: 进程使用的端口数量。
  • MEM: 进程占用的物理内存大小
  • PURG: 被清理的内存大小。
  • CMPR: 压缩的内存大小。
  • PGRP: 进程组ID。
  • PPID: 父进程的PID
  • STATE: 进程的当前状态。
  • BOOSTS: 任何优先级提升(或降低)的标记。
  • %CPU_ME: 此进程自身的CPU使用率。
  • %CPU_OTHRS: 其他进程的CPU使用率。
  • UID: 用户标识符,标识运行此进程的用户
  • FAULT: 页面错误的次数。
  • COW: 写时复制的页面数。
  • MSGSEN/MSGREC: 发送和接收的消息数。
  • SYSBSD/SYSMACH: BSD和Mach系统调用的次数。
  • CSW: 上下文切换次数。
  • PAGE: 页面错误的次数。
  • IDLE: CPU空闲时间的百分比。
  • POWE: 能耗估算。
  • INSTRS: 执行的指令数。
  • CYCLES: 处理器周期数。
  • USER: 运行此进程的用户名。

通过一个简化的 jstack 输出例子来解释其中的一些关键指标。这里是一个典型的 jstack 输出示例:

"main" #1 prio=5 os_prio=0 tid=0x00007f0f74008000 nid=0x1e15 waiting on condition [0x00007f0f74efb000] java.lang.Thread.State: TIMED_WAITING (sleeping) at java.lang.Thread.sleep(Native Method) - locked <0x00000000f5a0f5b8> (a java.lang.ref.Reference$Lock) at com.example.MyClass.myMethod(MyClass.java:123)

现在,让我们解析这个输出:

  • 线程名称和序号
    • "main" #1:这是线程的名称和序号。这里的线程名是 "main",通常是 Java 程序的主线程。#1 表示这是 JVM 中的第一个线程。
  • 线程优先级
    • prio=5:这是线程的优先级,范围从 1(最低)到 10(最高)。这里的优先级是 5,是默认值。
  • 操作系统线程优先级
    • os_prio=0:这是线程在操作系统层面的优先级。这个值依赖于操作系统和 JVM 的实现。
  • 线程 ID
    • tid=0x00007f0f74008000:这是 JVM 内部为线程分配的唯一标识符,以十六进制表示。
  • 本地线程 ID
    • nid=0x1e15:这是操作系统为线程分配的本地标识符,同样以十六进制表示。在某些情况下,可用于将 JVM 中的线程与操作系统级别的线程关联起来。
  • 线程状态
    • java.lang.Thread.State: TIMED_WAITING (sleeping):这是线程的状态。TIMED_WAITING 通常意味着线程正在执行某种形式的等待,这里是由于 sleep 方法引起的。
  • 方法调用
    • at java.lang.Thread.sleep(Native Method):这显示了线程在调用栈的当前位置。在这个例子中,线程正在执行 Thread.sleep 方法。
    • at com.example.MyClass.myMethod(MyClass.java:123):这是调用栈的下一个记录。这表明 myMethod 在 MyClass.java 的第 123 行被调用。
  • 锁信息
    • - locked <0x00000000f5a0f5b8>:这表示线程当前持有的锁。锁是在对象 0x00000000f5a0f5b8 上,这是一个内部的对象引用。

通过分析这些信息,可以获取线程的当前状态和活动,这对于诊断性能问题和并发问题非常有帮助。例如,如果多个线程都在等待同一个锁,那可能就是死锁的迹象。或者,如果一个线程长时间处于 RUNNABLE 状态并消耗大量 CPU,那可能是性能问题的源头。

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

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

相关文章

缓存cache和缓冲buffer的区别

近期被这两个词汇困扰了&#xff0c;感觉有本质的区别&#xff0c;搜了一些资料&#xff0c;整理如下 计算机内部的几个部分图如下 缓存&#xff08;cache&#xff09; https://baike.baidu.com/item/%E7%BC%93%E5%AD%98 提到缓存&#xff08;cache&#xff09;&#xff0c;就…

OpenAI“一路生花”,致力于超级人工智能研发

原创 | 文 BFT机器人 INTELLIGENT ROBOT OpenAI提供1000万美元的资助用于解决超级智能AI控制问题 OpenAI是人工智能研究领域的领先组织&#xff0c;据媒体称&#xff0c;它正在采取积极措施应对与超级智能AI系统相关的潜在风险。在一项大胆的举措中&#xff0c;该公司宣布将提…

独立站如何优化网页加载速度

对于跨境电商独立站而言&#xff0c;流量是跨境电商业务的重中之重&#xff0c;由于独立站并不自带流量&#xff0c;非常依赖于谷歌搜索引擎自然流量&#xff0c;以及付费广告流量。 但随着付费流量价格日益水涨船高&#xff0c;为了摆脱对付费流量的依赖&#xff0c;相信广大…

可移动磁盘上的文件删除了怎么恢复?详细教程介绍

在我们的日常生活和工作中&#xff0c;可移动磁盘作为一种便携式的存储设备&#xff0c;经常被用来备份和传输数据。然而&#xff0c;有时候由于误操作或不小心的删除&#xff0c;导致可移动磁盘上的文件丢失。这些文件可能包含重要的工作资料、个人照片、视频等&#xff0c;一…

【YOLO系列】YOLOv8 -【教AI的陶老师】

文章目录 yolo v8 模型结构图这样搞有什么意义&#xff1f;【获得不同尺寸的输出】c2f 详细结构yolo v8 损失函数与 yolo v5 的区别 yolo v8 模型结构图 详细结构图 这样搞有什么意义&#xff1f;【获得不同尺寸的输出】 c2f 详细结构 yolo v8 损失函数 与 yolo v5 的区别

超声波测距系统

文章目录 前言一、功能描述一、界面一二、界面二三、界面三四、界面四五、初始界面 二、编程实现 前言 具有测距、温度补充、实时时钟、记忆、阈值警报、串口数据发送等等功能&#xff0c;通过LCD1602显示&#xff0c;按键进行相关操作。 一、功能描述 LCD1602显示共有五个界面…

第1章 Kali Linux入门

本章将带领读者初步了解渗透测试专用的独立Linux 操作系统——Kali Linux。本章涵盖下述主题&#xff1a; ● Kali 的发展简史&#xff1b; ● Kali 的一般用途&#xff1b; ● Kali 的下载与安装&#xff1b; ● Kali 的配置与更新。 在本章的结尾部分&#xff0c;我们还…

【进阶】【JS逆向爬虫】【2.JavaScript 基础语法】JS代码导入方式

JS逆向爬虫 JS代码导入方式1.行内式写法2.内嵌式&#xff08;建议写在</body>之前&#xff09;3.外部式&#xff08;建议写在</head>之前&#xff09; JS代码导入方式 1.行内式写法 可以将单行或少量 JS 代码写在HTML标签的事件属性中&#xff08;以 on 开头的属…

centos安装Docker和DockerCompose

Docker CE 支持 64 位版本 CentOS 7&#xff0c;并且要求内核版本不低于 3.10&#xff0c; CentOS 7 满足最低内核的要求&#xff0c;所以我们在CentOS 7安装Docker。 安装Docker 卸载旧版docker 旧版本的 Docker 采用docker或docker-engine。在尝试安装新版本之前卸载任何此…

GitHub提交项目到仓库fatal: No configured push destination.

原因&#xff1a;没指定提交到哪个远程仓库 解决方法&#xff1a; 在你git add .和commit之后 git add . git commit -m "信息" git push前输入以命令 git branch -M main git remote add origin gitgithub.com:xxx(你GitHub的名称)/xxx.git(你仓库的名称) git …

【计算机网络】第五,六章摘要重点

1.运输层协议概述 运输层提供的是进程之间的通信 2. 3.套接字指的是什么 ip地址端口号 4.每一条TCP语句唯一地被通信两端连接的两个端点 5.TCP传输如何实现 以字节为单位的滑动窗口 超时重传 选择确认 6.TCP流量控制和拥塞控制的区别 流量控制&#xff1a;点对点通信…

Cisco模拟器-OSPF路由协议

设计要求用两台双口路由器连接不同IP网段的计算机&#xff0c;并使用OSFP协议发现路由表使不同IP网段的计算机可以相互通信。 通过设计&#xff0c;可以连通IP地址网段不同的局域网&#xff0c;可应用在园区网的互连和互通的实现上。 主要配置步骤 路由器0&#xff1a; Router…

【PostgreSQL】从零开始:(三十九)约束-主键

主键 主键&#xff08;Primary Key&#xff09;是数据库表中用于唯一标识每一行记录的字段。主键具有以下特点&#xff1a; 唯一性&#xff1a;每个主键值在表中是唯一的&#xff0c;不允许出现重复值。非空性&#xff1a;主键字段的值不能为空&#xff0c;即主键字段不能为n…

四十八----react实战

一、项目中css模块化管理 1、css-loader 以下可以使用styles.xxx方式使用class是因为使用css-loader配置了module。 import styles from ./index.less export const App(){return <div className={styles.xxx}>hello word</div> }//webpack配置 {test:/\.css$/,u…

猫捉老鼠(C语言)

读题&#xff1a; 一只老鼠躲进了10个环形分布的洞的一个中。并按1,2,3,4,5,6,7,8,9,10进行编号&#xff0c;猫在第一个洞中没有找到老鼠&#xff0c;就隔一个洞查找&#xff0c;及到第三个洞去找&#xff1b;但没有找到&#xff0c;然后就隔两个洞继续寻找&#xff0c;及到第…

编程笔记 html5cssjs 017 HTML样式

编程笔记 html5&css&js 017 HTML样式 一、HTML样式二、CSS3小结 HTML样式是用来控制网页元素外观的一组属性和值。 一、HTML样式 可以通过以下几种方式来为HTML元素添加样式&#xff1a; 内联样式&#xff1a;直接在HTML元素的style属性中添加样式。例如&#xff1a;…

Spring java和go并发的实现策略

Spring Java框架和Go框架在处理并发请求时采用了不同的策略。 1. Spring Java框架&#xff1a; Spring框架基于Java语言&#xff0c;通常使用线程池来处理并发请求。具体来说&#xff0c;Spring框架中的Servlet容器&#xff08;如Tomcat、Jetty等&#xff09;会使用线程池来管…

24、Web攻防——通用漏洞SQL注入MYSQL跨库ACCESS偏移

文章目录 一、SQL注入原理   脚本代码在与数据库进行数据通讯时&#xff08;从数据库取出相关数据进行页面显示&#xff09;&#xff0c;使用预定义的SQL查询语句进行数据查询。能通过参数传递自定义值来实现SQL语句的控制&#xff0c;执行恶意的查询操作&#xff0c;例如查询…

C# 使用ZXing.Net生成带Logo的二维码

写在前面 这是ZXing.Net类库的系列文章&#xff0c;实现在二维码中间插入一个logo图标 C# 使用ZXing.Net生成二维码和条码-CSDN博客 C# 使用ZXing.Net识别二维码和条码-CSDN博客 代码实现 该段代码主体来自其他文章&#xff0c;贴在这做个记录 /// <summary> /// 生成…

【教程】Typecho Joe主题开启并修复壁纸相册不显示问题

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhang.cn] 背景说明 Joe主题本身支持“壁纸”功能&#xff0c;其实就是相册。当时还在网上找了好久相册部署的开源项目&#xff0c;太傻了。 但是网上教程很少&#xff0c;一没说如何开启壁纸功能&#xff0c;二没说开启后为…