性能分析(1)- Java 进程导致 CPU 使用率升高,问题怎么定位?

简介: 性能分析(1)- Java 进程导致 CPU 使用率升高,问题怎么定位?

性能分析小案例系列,可以通过下面链接查看哦

https://www.cnblogs.com/poloyy/category/1814570.html

ps:这些分析小案例不能保证完全准确哦,是博主学习过程中的总结,仅做参考

 

前提


本机有一个很占用 CPU 的项目,放在了 Tomcat 下启动着

image.png

如何定位


Jmeter 聚合报告

image.png

  • 可以看到平均响应时间不断的上升,但是吞吐量(TPS)很低
  • 平均响应时间一般超过 1s,就要排除网络有没有瓶颈

 

排查网络是否有瓶颈

在 cmd ping 自己的服务器 ip 地址,看是否有很大的延时或丢包

image.png

可以看到,没有丢包,而且延时也很低,证明网络没有问题

 

在服务器中,通过 top 查看是否有进程的用户态(us)过高

top

image.png

  • 可以看到是 Java 进程导致 CPU 使用率贼高,已经占满了四个 CPU
  • 记住该进程 PID

 

通过 ps 命令确认具体是哪个进程

ps -aux | grep2838

image.png

很明显,就是我们 Java 程序所在的 Tomcat 进程啦

 

通过 top 查看 Java 进程的线程执行情况

2838 是进程 id 哦(pid)

top -Hp 2838

image.png

  • 上面的 PID 就是线程的 PID
  • 按照线程的 CPU 使用率从高到低排序

 

将排在前面的线程 PID 转换成十六进制

printf "%x\n"4808

image.png

打印 Java 线程栈的信息

jstack 2838 | grep 12c8 -A30

  • 2838:java 进程
  • 12c8:线程十六进制
  • -A30:打印 30 行

image.png

  • 包含:包名、类名、代码行信息,可以快速定位到某行代码导致该线程 CPU 使用率过高
  • jstack:JDK 自带命令

 

分析思路过程

  • 使用 Jmeter 进行压测,通过观察聚合报告,发现 TPS 很低只有2.几,但是响应时间很高
  • 响应时间很高首先要排查是否是网路原因,通过 ping 服务器的 IP 发现延时很低,不存在网络问题
  • 通过 top 查看服务端的系统资源情况,发现用户态 CPU 使用率比较高,即存在占用 CPU 高的进程,查看进程列表,发现一个 Java 进程的 CPU 占用率特别高
  • 通过 ps 命令确认该进程的详细信息
  • 通过 top -Hp 查看该进程的所有线程信息
  • 将排在前面的 Java 线程号打印成 16 进制字符串
  • 通过 jstack 打印 Java 线程栈的信息,可以发现是某一行代码的问题
相关文章
|
2月前
|
Java 程序员 调度
【JAVA 并发秘籍】进程、线程、协程:揭秘并发编程的终极武器!
【8月更文挑战第25天】本文以问答形式深入探讨了并发编程中的核心概念——进程、线程与协程,并详细介绍了它们在Java中的应用。文章不仅解释了每个概念的基本原理及其差异,还提供了实用的示例代码,帮助读者理解如何在Java环境中实现这些并发机制。无论你是希望提高编程技能的专业开发者,还是准备技术面试的求职者,都能从本文获得有价值的见解。
47 1
|
2天前
|
Java 关系型数据库 MySQL
java控制Windows进程,服务管理器项目
本文介绍了如何使用Java的`Runtime`和`Process`类来控制Windows进程,包括执行命令、读取进程输出和错误流以及等待进程完成,并提供了一个简单的服务管理器项目示例。
12 1
|
4天前
|
运维 监控 Java
使用jps命令查看Java进程
`jps`是Java开发者和系统管理员的得力助手,它简化了Java进程监控的过程,使得快速检查应用运行状态变得轻而易举。通过合理利用其提供的参数,可以高效地进行故障排查、性能监控及日常管理任务,确保Java应用稳定运行。
10 2
|
2天前
|
存储 Java
深入理解java对象的访问定位
这篇文章深入探讨了Java对象的访问定位机制,比较了使用句柄和直接指针两种主流的对象访问方式,并指出了它们各自的优势,例如句柄访问在对象移动时的稳定性和直接指针访问的速度优势。
9 0
深入理解java对象的访问定位
|
2月前
|
小程序 JavaScript Java
【Java】服务CPU占用率100%,教你用jstack排查定位
本文详细讲解如何使用jstack排查定位CPU高占用问题。首先介绍jstack的基本概念:它是诊断Java应用程序线程问题的工具,能生成线程堆栈快照,帮助找出程序中的瓶颈。接着,文章通过具体步骤演示如何使用`top`命令找到高CPU占用的Java进程及线程,再结合`jstack`命令获取堆栈信息并进行分析,最终定位问题代码。
148 1
【Java】服务CPU占用率100%,教你用jstack排查定位
|
2月前
|
消息中间件 算法 Java
深入浅出操作系统:进程管理的艺术掌握Java中的异常处理机制
【8月更文挑战第30天】在数字世界的舞台上,操作系统扮演着导演的角色,精心安排着每一个进程的表演。本文将揭开进程管理的神秘面纱,从进程的诞生到终结,探究它们如何在操作系统的指挥下和谐共舞。通过生动的比喻和直观的代码示例,我们将一同走进操作系统的核心,理解进程调度、同步与通信的内在机制,以及它们对计算生态的重要性。让我们跟随代码的节奏,一起感受操作系统的魅力吧!
|
2月前
|
监控 安全 Java
Java多线程调试技巧:如何定位和解决线程安全问题
Java多线程调试技巧:如何定位和解决线程安全问题
83 2
|
1月前
|
Linux
使用funcgraph-retval和bpftrace/kprobe快速定位并解决cpu控制器无法使能的问题
使用funcgraph-retval和bpftrace/kprobe快速定位并解决cpu控制器无法使能的问题
|
2月前
|
C# 开发者 数据处理
WPF开发者必备秘籍:深度解析数据网格最佳实践,轻松玩转数据展示与编辑大揭秘!
【8月更文挑战第31天】数据网格控件是WPF应用程序中展示和编辑数据的关键组件,提供排序、筛选等功能,显著提升用户体验。本文探讨WPF中数据网格的最佳实践,通过DevExpress DataGrid示例介绍其集成方法,包括添加引用、定义数据模型及XAML配置。通过遵循数据绑定、性能优化、自定义列等最佳实践,可大幅提升数据处理效率和用户体验。
55 0
|
2月前
|
缓存 网络协议 API
【APIM】Azure APIM抛出 java.lang.RuntimeException 错误定位
【APIM】Azure APIM抛出 java.lang.RuntimeException 错误定位