JVM调优,快速定位服务CPU过高,有理论配合实战,还不快收藏?
mhr18 2025-01-11 15:27 13 浏览 0 评论
JVM调优 | 快速定位服务CPU过高(理论)
在生产环境中,有时会遇到一些CPU占用过高,一直下不去的场景。出现这种情况,可能会导致服务对外中断,服务器超负荷运行影响硬件寿命。这篇文章从实践出发,一步一步地分析如何使用 ?top? ??和? ?jstack? ?命令快速定位问题代码位置。
一、top命令
? top ? (table of processes) is a ? ?task manager? ?? program, found in many ? ?Unix-like? ? operating systems, that displays information about CPU and memory utilization.
? ?维基百科? ??解释到,top (进程表)是一个任务管理器程序,可以在许多类 ? ?unix? ?操作系统中找到,它显示有关 CPU 和内存使用情况的信息。
同时,top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器。比较准确的说,top命令提供了实时的对系统处理器的状态监视.它将显示系统中CPU最“敏感”的任务列表.该命令可以按? CPU使用 ?、? 内存使用 ?和? 执行时间 ?对任务进行排序。
上图是一个? ?Centos 7? ? 系统,执行top命令后瞬时的展示信息。
- 第一行描述系统的信息,包括开机时间、用户登录、CPU整体负载
- 第二行描述任务总体执行情况,即各类进程占比情况
- 第三行描述CPU总体信息,比如空闲占比等
- 第四行描述物理内存占比情况
- 第五行描述交换区占比情况
- 动态的列表描述的详细进程各项信息,比如? PID ? 进程ID, ? %CPU ? 进程占用CPU的使用率,? TIME+ ? 该进程启动后占用的总的CPU时间,即占用CPU使用时间的累加值。
一般linux系统会自带top命令,还有另外一个命令行工具 ? ?htop? ?,有时需要自行安装,它与传统的 top 命令功能一样,但它有更加强大的功能及能显示更多的信息。
二、 jstack命令
? jstack ? prints Java stack traces of Java threads for a given Java process or core file or a remote debug server。
? ?oracle官网? ?解释到,Jstack 打印给定 Java 进程或核心文件或远程调试服务器的 Java 线程的 Java 堆栈跟踪。
对于每个 Java 框架,使用jstack指令将打印完整的类名、方法名、“ bci”(字节码索引)和行号(如果可用)。使用-m 选项,jstack 将打印所有线程的 Java 和本机帧以及“ pc”(程序计数器)。
用法很简单,如下图。
一般说,我们会先使用? ?jps? ?命令显示当前所有java进程pid的命令。
$jps
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XZxLXjOe-1628255428026)(https://upload-images.jianshu.io/upload_images/26464854-8cd522cd811debd3.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]
然后再执行对执行进程ID 执行 jstack。
$ jstack 15673
如果明确自己的Java进程ID,当然直接使用 jstack指令即可。
三、实战
3.1 实战之前准备
先写一个简单的榨干CPU的例子? ?CpuDryOutExample.java? ?,内容相当的easy,就是在无中断条件的循环语句中,不断地执行打印内容操作。
?写个例子?
public class CpuDryOutExample {
public static void dryOut() {
while (true) {
System.out.println("dry out utilization rate of cpu");
//do something
}
}
public static void main(String[] args) {
CpuDryOutExample.dryOut();
}
}
?编译?
$javac CpuDryOutExample.java
输出? ?CpuDryOutExample.class? ?,注意最好去掉java文件里面的package,否则编译过程中很有可能会报找不到main方法,当然你编译时特殊处理也行。
?运行?
将? ?CpuDryOutExample.class? ??上传到? ?Centos 7? ? 服务器上,该服务器已经预先配置好了Java运行环境(JRE),然后执行下面命令运行程序。
$java CpuDryOutExample
此时屏幕疯狂输入? dry out utilization rate ?
3.2 定位问题
定位的核心是三个步骤
- 找到CPU占用率比较高的进程ID
- 在指定进程ID的进程中寻找进程CPU占用率比较高的线程ID
- 通过线程ID去搜索打印出的进程堆栈日志,定位到具体的问题
?找到CPU占用率比较高的进程ID?
在终端上输入? ?top? ?命令
$top
可以明显的看出PID为9573的进程CPU占用率最高,我们使用? ?htop? ?命令会更加直观一点。
?查看进程里面线程运行的信息?
我们都知道线程是处理器任务调度和执行的基本单位,一个进程下是是包含多个线程。进程粒度还是过大,不便于我们定位到具体的代码位置,我们需要找到具体是哪个线程过度使用CPU。
我们还是使用? ?top? ?命令。
//-H 显示线程信息,-p指定pid jstack 线程ID
#$top -Hp 9573
图上可以真正的看出,使CPU使用率暴涨的罪魁祸首是线程 9574。当然使用? ?htop? ?我们也能很快的定位到具体线程。
?分析过滤定位问题?
因为线程ID在堆栈日志中是以16进制呈现,我们先进行进制转换。
$printf %s 9574
然后打印堆栈日志到临时文件1.txt
# 注意是进程ID
$jstack 9573 > 1.txt
然后在文件中搜索线程所在位置
//在文件中搜索过滤并打印30条数据
$cat 1.txt | grep -A 30 2566
可以清楚的看到,红框位置就是具体问题代码。
四、总结
除了使用? ?top/htop + jstack? ?? 命令的方式,我们也可以使用? ?JMC? ??快速定位CPU占用率过高的问题,虽然? ?JMC? ?确实比前者更加简单高效,但是只能使用JMX实现远程连接,如果部署的服务没有启用JMX是用不上这个工具。
那么回到问题的根源,什么场景会导致CPU占用率过高呢?
序列化和反序列(使用合理的类库)
正则表达式(回溯导致,避免回溯)
频繁GC,GC线程频发执行垃圾回收算法(降低GC频率)
频繁 的线程上下文切换(降低切换的频率,根据业务合理建立线程池)
无限while循环(尽量有限循环,即设置中断条件,让循环执行的慢一点,即? ?Thead.yield? ?)
频繁创建新对象(合理使用单例)
原文链接:https://blog.51cto.com/u_15477630/5051043?utm_source=tuicool&utm_medium=referral
- 上一篇:Windows10安装Java8
- 下一篇:一、Java概述
相关推荐
- jdk17安装和配置环境变量(jdk安装步骤环境变量配置)
-
简单介绍JDK17是Java的一个长期支持(LTS)版本,于2021年9月发布。作为LTS版本,它将获得Oracle的长期支持,这意味着会获得安全更新和错误修复,直到2...
- jdk8安装和配置环境变量(jdk8配置环境变量win10)
-
简单介绍JDK8是Java开发工具包的一个重大版本,于2014年3月发布。它引入了许多重要的新特性,极大地改进了Java编程的体验,并提高了代码的效率和可读性。总结JDK8是一...
- Java开发环境的准备流程!(java开发环境的准备流程有哪些)
-
准备开发环境工欲善其事,必先利其器。在学习本书的技术内容之前,应先将开发环境搭建好。本书所涉及的基础环境将在本章准备,包括JDK、IntelliJIDEA和Maven。如果读者对这些环境较为熟悉,可...
- skywalking-全链路跟踪(链路追踪sleuth)
-
一、概述1、skywalking简介SkyWalking是一款广受欢迎的国产APM(ApplicationPerformanceMonitoring,应用性能监控)产品,主要针对微服务、Clou...
- Oracle项目管理系统之成本状态跟踪
-
卷首语成本费用管理模块功能分为公司级、项目级两个层级,其中公司级功能包括概预算管理、概预算定额管理、预算模板管理,以及控制估算管理等功能。费用与成本成本费用管理主要是为了合理利用资金资源,控制企业的成...
- 从入门到精通,Java最全学习路线(java自学路线)
-
最近好多小伙伴询问,该如何学习java?那些视频适合零基础学习呢?大多数都是一些刚入门的新手,还不了解这个行业,也不知道从何学起,开始的时候非常迷茫,在这给大家整理出一些学习路线。Java学习路线在这...
- SPARC M7最新技术 甲骨文首度在台发表
-
甲骨文首度在台发表SPARCM7最新技术,宣布推出全新SPARC系统產品系列,採用革命性的32内核、256执行绪SPARCM7微处理器。这套SPARC系统提供:先进的入侵防护和加密的Securit...
- 轻量化的企业级OLAP方案2(轻量化ar)
-
上一篇文章讲了一个轻量化的企业级OLAP方案,这一篇文章继续介绍另外一个方案。方案2:Greenplum1Greenplum介绍1.1Greenplum概念Greenplum数据库是一种基于Po...
- 时序数据库在水电站领域的应用(时序数据库优缺点)
-
大家好,上期经过了王宏志教授对数据库前沿领域的介绍,不知道小伙伴们是否对数据库领域有了更深的认识呢,本期让我们回归时序数据库,再来聊一聊时序数据库在水电站领域的应用。本文仅代表个人观点,如有偏颇之处,...
- 数据库SQL引擎比较(数据库引擎有哪些,有什么区别)
-
数据库SQL引擎的典型工作机制及详细分析如下,涵盖查询处理全流程中的核心机制与实际案例:一、SQL引擎核心处理流程1.解析与校验阶段词法/语法解析:SQL语句被拆解为Token序列,构建...
- Ubuntu系统密码(root密码)的修改方法
-
本文介绍在Linux系统的Ubuntu电脑中,修改账户用户密码(同时也修改了root用户密码)的方法。首先,如果此时处于登录页面(也就是意识到自己忘记密码的那个页面),就先点击右上角的关闭按钮...
- TablePlus:一个跨平台的数据库管理工具
-
TablePlus是一款现代化的跨平台(Window、Linux、macOS、iOS)数据库管理工具,提供直观的界面和强大的功能,可以帮助用户轻松管理和操作数据库。TablePlus免费版可以永久...
- 云满足用户对通过单一视图了解整体运营和数据的需求
-
ZD至顶网软件频道消息:云在简化IT和业务的同时也带来了新问题,这很有趣,不是吗?毫无疑问,云大幅降低了企业运行基础设施和应用的复杂性和成本;但您仍然面临一个老生常谈的问题——孤岛,只不过这次是在云...
- SQL_TOP(显示数据条数)(sqlserver显示查询的行数)
-
(8)SELECT(9)DISTINCT(11)<topNum><selectlist>(1)FROM[left_table](3)<join_type>...
- php搭建小型部门网站(php构建网站)
-
熟悉前端html,js,css,后端熟悉php,python,java只能称得上一般,还有很多坑待踩。鉴于所学很杂,决定利用对业务的熟悉来搞一个部门网站来简化大家的工作流程。初步设计方案后端用p...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- oracle位图索引 (74)
- oracle批量插入数据 (65)
- oracle事务隔离级别 (59)
- oracle 空为0 (51)
- oracle主从同步 (55)
- oracle 乐观锁 (51)
- redis 命令 (78)
- php redis (88)
- redis 存储 (66)
- redis 锁 (69)
- 启动 redis (66)
- redis 时间 (56)
- redis 删除 (67)
- redis内存 (57)
- redis并发 (52)
- redis 主从 (69)
- redis 订阅 (51)
- redis 登录 (54)
- redis 面试 (58)
- 阿里 redis (59)
- redis 搭建 (53)
- redis的缓存 (55)
- lua redis (58)
- redis 连接池 (61)
- redis 限流 (51)