快速定位Java应用卡顿的原因
快速定位Java应用卡顿的原因
背景
同事的环境说出现了一周的卡顿现象.
元旦加班期间告诉我时已经是2024.1.1下午五点了.
当时没有来得及去查看.
上班之后发现问题很简单. 不过为了能够指导一下后续的工作.还是在这里总结一下操作过程.
判断问题的整体思路
0. 同事告知出现卡顿.
询问卡顿的现象: 程序启动后, 运行一段时间后就卡顿. 无法缓解.
1. 查看宿主机以及虚拟机的情况:
判断是否是宿主机性能导致问题. 发现宿主机的CPU较高, 但是大部分CPU在这一台机器上面.
2. 进入Linux系统. top -Hp 进行观察
发现java进程占用CPU忽高忽低, 基本确认是在fullGC. 怀疑产品有内存泄露.
3. jstat -gcutil $pid 1000 1000
查看GC次数, 发现基本上10秒左右一次FullGC.基本确认存在问题.
4. jcmd $pid GC.heap_dump /root/20240102.dump
转储dump文件, 并且使用mat进行分析
5. 查看leak suspect 以及进行查看堆栈信息. 按照使用的堆区大小进行排序
定位到具体的内存占用较高的点. 发现是发送消息时因为获取了所有的消息体导致内存占用量大. 并且消息发送一分钟一次,较为频繁.
6. 反馈给业务开发, 调整消息发送时的个数限制,以及增加频率限制. 避免一次性进行所有消息的发送, 导致系统阻塞.
关于jcmd命令的使用
jcmd 从jdk7 开始就是java自带的应用了
其实是java应用里面进行定位问题的最佳工具之一.
需要建议, 如果程序使用哪个版本的java, 必须使用相同版本的 jcmd 等工具进行分析
不然那会出现加载失败等的问题.
jcmd 的命令介绍
jcmd -l
与jps 一样 展示所有的 正在运行的java 进程.
jcmd $pid help
查看jcmd的帮助列表, 需要说明. 不同版本的jcmd包含的命令不太一样
可以直接使用jcmd 0 help 进行查看.
[root@CentOS8 ~]# jcmd 0 help
2096872:
The following commands are available:
VM.native_memory
ManagementAgent.stop
ManagementAgent.start_local
ManagementAgent.start
VM.classloader_stats
GC.rotate_log
Thread.print
GC.class_stats
GC.class_histogram
GC.heap_dump
GC.finalizer_info
GC.heap_info
GC.run_finalization
GC.run
VM.uptime
VM.dynlibs
VM.flags
VM.system_properties
VM.command_line
VM.version
help
比较常用的其实有
jcmd 0 VM.flags
jcmd 0 VM.system_properties
jcmd 0 VM.command_line
jcmd 0 GC.heap_info
jcmd 0 GC.class_histogram
jcmd 0 Thread.print
jcmd 0 GC.heap_dump /path/to/gcfile
除此之外 还有
jstat -gcutil pid 1000 1000 每秒钟展示一次gc信息.
快速定位Java应用卡顿的原因的更多相关文章
- android中fragment卡顿的原因
首页的ViewPager有十几个Fragment,在快速切换的时候,容易产生卡顿现象. 二.分析当ViewPager切换到当前的Fragment时,Fragment会加载布局并显示内容,如果用户这时快 ...
- android中listview滑动卡顿的原因
导致Android界面滑动卡顿主要有两个原因: 1.UI线程(main)有耗时操作 2.视图渲染时间过长,导致卡顿 http://www.tuicool.com/articles/fm2IFfU
- firefox中outlook.com页面卡顿的原因
在火狐中使用outlook.com时,鼠标点击动作后,页面会卡顿一段时间,每次点击都是如此. 因为之前火狐出现由于硬件加速导致页面卡顿的情况,因此第一反应就是关闭硬件加速. 果然,关闭硬件加速后,页面 ...
- 快速定位java系统的线上问题--转
原文地址:http://m.blog.csdn.net/article/details?id=43376943 前言:我们的场景并没有像BAT等大型互联网公司里的系统那么复杂,但是基本上也有一定的规模 ...
- Linux 下定位java应用 cpu高的原因(转)
使用场景: 遇到Linux下java应用cpu占用很高的时候,我们很想知道此时的应用到底在做什么导致资源的消耗. 方便我们进一步定位和优化~ 1.查询cpu耗用top5的进程(你也可以top10) [ ...
- eclipse快速定位java对应的class
当前设置值,只能定位class文件 设置eclipse External Tools Configurations... Program --> new New 创建viewclass.bat文 ...
- android textview settext卡顿深层次原因
最近在公司项目里面发现listview里面的textview在调用settext函数的时候非常耗时,当时都有点不敢相信,这是因为如果你把textview设置成wrap_content,则每次调用set ...
- Android app 性能优化的思考--性能卡顿不好的原因在哪?
说到 Android 系统手机,大部分人的印象是用了一段时间就变得有点卡顿,有些程序在运行期间莫名其妙的出现崩溃,打开系统文件夹一看,发现多了很多文件,然后用手机管家 APP 不断地进行清理优化 ,才 ...
- 性能优化 BlockCanary 卡顿监测 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- Android 界面滑动卡顿分析与解决方案(入门)
Android 界面滑动卡顿分析与解决方案(入门) 导致Android界面滑动卡顿主要有两个原因: 1.UI线程(main)有耗时操作 2.视图渲染时间过长,导致卡顿 目前只讲第1点,第二点相对比较复 ...
随机推荐
- ElasticSearch之Get index settings API
获取指定索引的参数的值. 获取指定索引的全部参数,命令样例如下: curl -X GET "https://localhost:9200/testindex_002/_settings?pr ...
- 【李南江】从零玩转TypeScript
前言 老套路肯定是 需要知道TS是干啥用的啦. 1.什么是TypeScript(TS)? TypeScript简称TS TS和JS之间的关系其实就是Less/Sass和CSS之间的关系 就像Less/ ...
- kubernetes之部署war项目(二)
kubernetes之部署war项目(二) k8s系列 源自我工作上的实际场景,记录于此. 现在老项目是war包形式,需要基于tomcat部署,因此在打包镜像时将tomcat带上的. 假设我的war项 ...
- P6357 题解
Luogu 题面 题目描述 给定一串长度为 \(n\) 的数字,数字为 \(0 \sim 9\) 之间的任意一个,下标从 \(1\) 记起. 然后进行 \(m\) 次区间查询,每次查找区间 \([l, ...
- Spring 中循环依赖的处理
Spring 提供了十分强大的依赖注入功能,使得我们不再需要手动去管理对象的依赖项.然而,在实际的使用场景中,可能会遇到类似下面的依赖异常: Exception encountered during ...
- Asp .Net Core 系列:基于 Swashbuckle.AspNetCore 包 集成 Swagger
什么是 Swagger? Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务.它提供了一种规范的方式来定义.构建和文档化 RESTful Web ...
- 什么是全场景AI计算框架MindSpore?
摘要:MindSpore是华为公司推出的新一代深度学习框架,是源于全产业的最佳实践,最佳匹配昇腾处理器算力,支持终端.边缘.云全场景灵活部署,开创全新的AI编程范式,降低AI开发门槛. MindSpo ...
- GaussDB拿下的安全认证CC EAL4+究竟有多难?
摘要:近日,经过全球知名独立认证机构SGS Brightsight实验室的安全评估,华为云GaussDB企业级分布式数据库内核获得全球权威信息技术安全性评估标准CC EAL4+级别认证 本文分享自华为 ...
- 个性化联邦学习算法框架发布,赋能AI药物研发
摘要:近期,中科院上海药物所.上海科技大学联合华为云医疗智能体团队,在Science China Life Sciences 发表题为"Facing Small and Biased Dat ...
- 20级训练赛Round #4
给20级学弟学妹们带带榜单 A - 凯少的动作序列 枚举情况替换即可 #include <bits/stdc++.h> using namespace std; using ll = lo ...