JVM实操篇-线上CPU占用飙升99%,系统响应延时飙升访问偶发白屏
问题背景:
线上web应用系统java进程运行一段时候后,出现系统响应延迟飙升,访问系统出现偶发白屏
问题排查过程:
1.top查看jvm进程占用cpu飙升至99%
运行一段时间后cpu占用99%
访问系统白屏假死-很长时间才响应
2.怀疑jvm默认参数设置不合理: 排查jvm参数设置
jvm参数设置不合理:eden区占用较高 & meta space较小优化jvm参数
gc-log显示 eden区大小不够优化jvm参数
3.jvm参数优化后堆内存无压力:
jvm参数优化后堆内存无压力
metadata区满了: 不够用 -> 增大 meta区大小
-XX:MetaspaceSize=512M -XX:MaxMetaspaceSize=1024M
meta space占用
4.优化jvm参数后(运行一段时间后cpu占用还是飙升到99%) 且系统负载较高
排查cpu飙升过程:
vmstat 1 4
pidstat -p 866 -u -t 1 3 -> 查找占用cpu较高线程id 2109
printf "%x" 2109 -> 83d -> 问题线程nid: 0x83d
5.打印线程堆栈信息: 发现死锁问题
jstack -F -l 2109 >> /home/work/zhibi/jstack_2109_83d.txt -> Thread 2109: (state = IN_NATIVE) cpu 98% 发现有死锁
redis连接资源获取死锁问题
5.定位问题代码行
问题原因为: 获取Redis资源死锁问题 -> 修复即可。
定位死锁稳定代码行:
定位死锁问题代码行
问题代码行:
问题行加锁并发竞争激烈时会BOLCKED线程执行
线程由于获取jedis连接而被BLOCKED阻塞,列举几个问题线程堆栈如下: 【实际Redis是单线程操作无需加锁,小伙伴获取jedis连接写法有问题】
锁定jedis代码行
排查线程堆栈:
显示有多个接口被jedis获取锁阻塞,以下皆为等待jedis释放锁状态被BLOCKED 的线程 问题代码行
1.获取设备接口
2.心跳接口
- 物料接口
修复问题代码:
Redis是单线程操作无需加锁,获取jedis连接去掉加锁操作
我是架构师kimze,喜欢我的文章欢迎关注我,
我会坚持分享干货: 互联网微服务架构、云原生架构、行业动态、经典案例、技术趋势,
有问题欢迎关注私信或评论区回复交流
点赞、收藏、转发、评论 对我是一种支持,感谢!
相关文章
- jvm-08.jvm调优工具Arthas[通俗易懂]
- jvm垃圾回收算法有哪些_java垃圾回收算法几种
- JVM篇【Java源文件和Class字节码文件对比】
- jvm 吞吐量_jvm oom
- jvm的垃圾回收算法_jvm默认的垃圾回收器
- https://haobin.work/2021/12/01/jvm/jvm参数调优/
- JVM体系结构认知详解编程语言
- Java 底层机制(JVM/堆/栈/方法区/GC/类加载)详解编程语言
- JVM总结篇详解编程语言
- JVM分代垃圾回收策略的基础概念详解编程语言
- jvm调优-从eclipse开始详解编程语言
- 参数调整Linux系统下JVM参数的步骤(linux设置jvm)
- 如何在Linux系统上安装JVM?-教你简单易懂的方法(linux安装jvm)
- Efficiently Monitor JVM Memory on Linux with These Simple Tips(linux监控jvm内存)
- Linux JVM GC管理追求极致性能(linux jvm gc)
- 参数Linux下修改JVM参数的指南(linux修改jvm)
- Linux 系统 JVM 日志分析指南(linux jvm 日志)
- 如何在Linux下修改JVM参数配置(linux修改jvm参数)
- Oracle控制下的JVM开启新的技术时代(jvm受oracle控制)
- Redis引发JVM崩溃一个值得警惕的潜在风险(redis造成jvm死掉)
- Oracle JVM 解析完美的规范(oracle jvm规范)