【JVM线上故障排查】

对于后端程序员,特别是 Java 程序员来讲,排查线上问题是不可避免的。各种 CPU 飚高,内存溢出,频繁 GC 等等,这些都是令人头疼的问题。楼主同样也遇到过这些问题,那么,遇到这些问题该如何解决呢?

首先,出现问题,肯定要先定位问题所在,然后分析问题原因,再然后解决问题,最后进行总结,防止下次再次出现。

今天的文章,就如我们的题目一样,讲的是基本操作,也就是一些排查线上问题的基本方法。为什么这么说呢?因为线上问题千奇百怪,就算是身经百战的专家也会遇到棘手的问题,因此不可能在一篇文章里说完,还有一个最重要的原因,当然就是楼主的水平不到位。

但不到位归不到位,任何经验都是值得记录的,因此,楼主有必要将这些问题记录一下。

还有,本文的排查环境是 Linux.

1. CPU 飚高

线上 CPU 飚高问题大家应该都遇到过,那么如何定位问题呢?

思路:首先找到 CPU 飚高的那个 Java 进程,因为你的服务器会有多个 JVM 进程。然后找到那个进程中的 “问题线程”,最后根据线程堆栈信息找到问题代码。最后对代码进行排查。

如何操作呢?

通过 top 命令找到 CPU 消耗最高的进程,并记住进程 ID。
再次通过 top -Hp [进程 ID] 找到 CPU 消耗最高的线程 ID,并记住线程 ID.
通过 JDK 提供的 jstack 工具 dump 线程堆栈信息到指定文件中。具体命令:jstack -l [进程 ID] >jstack.log。
由于刚刚的线程 ID 是十进制的,而堆栈信息中的线程 ID 是 16 进制的,因此我们需要将 10 进制的转换成 16 进制的,并用这个线程 ID 在堆栈中查找。使用 printf “%x\n” [十进制数字] ,可以将 10 进制转换成 16 进制。
通过刚刚转换的 16 进制数字从堆栈信息里找到对应的线程堆栈。就可以从该堆栈中看出端倪。
从楼主的经验来看,一般是某个业务死循环没有出口,这种情况可以根据业务进行修复。还有 C2 编译器执行编译时也会抢占 CPU,什么是 C2 编译器呢?当 Java 某一段代码执行次数超过 10000 次(默认)后,就会将该段代码从解释执行改为编译执行,也就是编译成机器码以提高速度。而这个 C2 编译器就是做这个的。如何解决呢?项目上线后,可以先通过压测工具进行预热,这样,等用户真正访问的时候,C2 编译器就不会干扰应用程序了。如果是 GC 线程导致的,那么极有可能是 Full GC ,那么就要进行 GC 的优化。

2. 内存问题排查

说完了 CPU 的问题排查,再说说内存的排查,通常,内存的问题就是 GC 的问题,因为 Java 的内存由 GC 管理。有 2 种情况,一种是内存溢出了,一种是内存没有溢出,但 GC 不健康。

内存溢出的情况可以通过加上 -XX:+HeapDumpOnOutOfMemoryError 参数,该参数作用是:在程序内存溢出时输出 dump 文件。

有了 dump 文件,就可以通过 dump 分析工具进行分析了,比如常用的 MAT,Jprofile,jvisualvm 等工具都可以分析,这些工具都能够看出到底是哪里溢出,哪里创建了大量的对象等等信息。

第二种情况就比较复杂了。GC 的健康问题。

通常一个健康的 GC 是什么状态呢?根据楼主的经验,YGC 5 秒一次左右,每次不超过 50 毫秒,FGC 最好没有,CMS GC 一天一次左右。

而 GC 的优化有 2 个维度,一是频率,二是时长。

我们看 YGC,首先看频率,如果 YGC 超过 5 秒一次,甚至更长,说明系统内存过大,应该缩小容量,如果频率很高,说明 Eden 区过小,可以将 Eden 区增大,但整个新生代的容量应该在堆的 30% - 40% 之间,eden,from 和 to 的比例应该在 8:1:1 左右,这个比例可根据对象晋升的大小进行调整。

如果 YGC 时间过长呢?YGC 有 2 个过程,一个是扫描,一个是复制,通常扫描速度很快,复制速度相比而言要慢一些,如果每次都有大量对象要复制,就会将 STW 时间延长,还有一个情况就是 StringTable ,这个数据结构中存储着 String.intern 方法返回的常连池的引用,YGC 每次都会扫描这个数据结构(HashTable),如果这个数据结构很大,且没有经过 FGC,那么也会拉长 STW 时长,还有一种情况就是操作系统的虚拟内存,当 GC 时正巧操作系统正在交换内存,也会拉长 STW 时长。

再来看看 FGC,实际上,FGC 我们只能优化频率,无法优化时长,因为这个时长无法控制。如何优化频率呢?

首先,FGC 的原因有几个,1 是 Old 区内存不够,2 是元数据区内存不够,3 是 System.gc(), 4 是 jmap 或者 jcmd,5 是 CMS Promotion failed 或者 concurrent mode failure,6 JVM 基于悲观策略认为这次 YGC 后 Old 区无法容纳晋升的对象,因此取消 YGC,提前 FGC。

通常优化的点是 Old 区内存不够导致 FGC。如果 FGC 后还有大量对象,说明 Old 区过小,应该扩大 Old 区,如果 FGC 后效果很好,说明 Old 区存在了大量短命的对象,优化的点应该是让这些对象在新生代就被 YGC 掉,通常的做法是增大新生代,如果有大而短命的对象,通过参数设置对象的大小,不要让这些对象进入 Old 区,还需要检查晋升年龄是否过小。如果 YGC 后,有大量对象因为无法进入 Survivor 区从而提前晋升,这时应该增大 Survivor 区,但不宜太大。

上面说的都是优化的思路,我们也需要一些工具知道 GC 的状况。

JDK 提供了很多的工具,比如 jmap ,jcmd 等,oracle 官方推荐使用 jcmd 代替 jmap,因为 jcmd 确实能代替 jmap 很多功能。jmap 可以打印对象的分布信息,可以 dump 文件,注意,jmap 和 jcmd dump 文件的时候会触发 FGC ,使用的时候注意场景。

还有一个比较常用的工具是 jstat,该工具可以查看 GC 的详细信息,比如 eden ,from,to,old 等区域的内存使用情况。

还有一个工具是 jinfo,该工具可以查看当前 jvm 使用了哪些参数,并且也可以在不停机的情况下修改参数。

包括我们上面说的一些分析 dump 文件的可视化工具,MAT,Jprofile,jvisualvm 等,这些工具可以分析 jmap dump 下来的文件,看看哪个对象使用的内存较多,通常是能够查出问题的。

还有很重要的一点就是,线上环境一定要带上 GC 日志!!!

总结
基于文章的标题,我们这个是基本操作,故障排查是说不完的话题,每个故障涉及的知识也都很多,因此,我们在学习了基本的排查之后,还需要学习更多事故排查技术,比如排查 IO,网络,TCP 连接等等。楼主将在后面的文章中将这些基本操作都记录下来。

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

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

相关文章

【Vue3+Ts项目】硅谷甄选 — 品牌管理模块+平台属性管理模块

一、品牌管理模块 1.1 静态模块搭建 使用到element-plus的card、button、table、pagination等组件&#xff1a;src/views/product/trademark/index.vue <template><el-card><!-- 卡片顶部添加品牌按钮 --><el-button type"primary" size&quo…

k8s的集群调度---下

前情回顾 预算策略&#xff1a;过滤出合适的节点 优选策略&#xff1a;选择部署的节点 nodeName&#xff1a;硬匹配&#xff0c;不走调度策略。node01. nodeSelector&#xff1a;根据节点的标签选择&#xff0c;会走调度算法。 只要是走调度算法&#xff0c;在不满足预算策…

计算机图形学流体模拟 blender 渲染脚本

做流体模拟的时候&#xff0c;想要复现别人的成果&#xff0c;但是别人的代码都是每帧输出 ply 格式的文件&#xff0c;渲染部分需要自己完成 看了一下&#xff0c;似乎用 blender 是最简单的&#xff0c;于是记录一下过程中用到的代码 Blender 版本 4.0 批量导入 ply 假设…

LeetCode 31. 下一个排列

31. 下一个排列 整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列。 例如&#xff0c;arr [1,2,3] &#xff0c;以下这些都可以视作 arr 的排列&#xff1a;[1,2,3]、[1,3,2]、[3,1,2]、[2,3,1] 。 整数数组的 下一个排列 是指其整数的下一个字典序更大的排列。更正…

【hcie-cloud】【17】华为云Stack灾备服务介绍【灾备方案概述、备份解决方案介绍】【上】

文章目录 前言灾备方案概述灾备的定义灾备的重要性故障和灾难对业务连续性带来的挑战灾备系统的衡量指标RTO与RPO分析 灾备等级标准数据中心容灾解决方案全景图云灾备服务总结架构华为云Stack灾备服务总览 备份解决方案介绍云备份服务介绍备份服务架构介绍云备份服务组件功能介…

Oracle19c文档 tnsnames.ora (三)

官网地址&#xff1a;Local Naming Parameters in the tnsnames.ora File 欢迎关注留言&#xff0c;我是收集整理小能手&#xff0c;工具翻译&#xff0c;仅供参考&#xff0c;笔芯笔芯. 6.9连接数据部分 了解如何使用协议地址配置网络连接。 网络对象由协议地址标识。建立连接…

记录尝试投向不同的岗位——信息化专员——感想

1.保持随时响应的铃声 因为手机开启了远离手机的模式&#xff0c;然后会自动的把手机开启勿扰模式&#xff0c;导致对方打电话过来两次手机都没有响铃&#xff0c;本来就与岗位的匹配度低&#xff0c;然后没接到电话&#xff0c;这样连约面试的机会都没有。 人事提问 1.做过o…

210. 课程表 II(拓扑排序)

根据课程之间的关系构造一个有向图&#xff0c;题目要求求解是否能按照顺序学完所有课程&#xff0c;即判断这个有向图是否是有向无环图&#xff0c;如果是求出这个图的拓扑排序&#xff0c;如果不是返回[0] 求这个图的拓扑排序可以按照以下思路&#xff1a; 对于每个节点都有…

linux查找文件中的指定字符,并批量替换文件中指定字符

1、grep -rl “jquery-1.8.0.min.js” /opt 查找/opt 目录下存在jquery-1.8.0.min.js的文件 [rootlocalhost file1]# grep -rl "jquery-1.8.0.min.js" /opt /opt/file1/index.xhtml /opt/file2/index.xhtml /opt/shell.sh扩展&#xff1a;使用该命令可以查找文件中…

DevEco Studio预览时报错:Build task failed. Open the Run window to view details.

图一&#xff1a; 解决方案 图二 &#xff1a; 图三&#xff1a; 按照以上图示步骤&#xff0c;去掉图三中3号标记的勾选

Android-消息机制Handler

Handler的机制:Android 消息传递机制就是handler。在多线程的应用场景中&#xff0c;将工作线程中需更新UI的操作信息 传递到 UI主线程&#xff0c;从而实现对UI的更新处理&#xff0c;最终实现异步消息的处理。多个线程并发更新UI的同时 保证线程安全。Handler只是一个入口&am…

Android studio ListView应用设计

一、添加ListView控件: <ListViewandroid:id="@+id/listView"android:layout_width="match_parent"android:layout_height="match_parent"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintTop_toTopOf=&qu…

Android开发 基于ARouter开源的路由框架的YmRouter

一、ARouter的简介 ARouter是一个用于Android的路由框架&#xff0c;它能够帮助开发者实现组件之间的通信和页面跳转。 ARouter的核心原理是通过注解来标记和生成路由映射表。开发者只需要在需要跳转的页面上添加注解&#xff0c;然后在代码中通过路由表找到对应的页面进行跳…

/usr/bin/ld: error: ../../lib/libnvinfer.so: file too short

一、背景 在编译TensorRT官方的C库时&#xff0c;库里是提供了命令行工具bin文件夹下的可执行程序trtexec&#xff0c;可以直接进行onnx的fp16以及int8量化&#xff0c;但我模型的输入是5维&#xff0c;模型里面全都是3D卷积&#xff0c;所以要对底层头文件进行修改。重新编译…

Python词云wordcloud库不显示中文

博主之前在项目中发现Python的词云库wordcloud显示的都是方框&#xff0c;别担心&#xff0c;我有一个妙招让你的中文词云变得美观又清晰&#xff01; 问题 wordcloud是一个基于python的词云生成库&#xff0c;它可以让你用简单的代码创建出各种形状和颜色的词云图像。 word…

工业数据采集分析——工厂大脑 提升综合经济效益

随着企业对数字化的认知越来越清晰&#xff0c;对工业数智化的战略越来越明确&#xff0c;企业的诉求也在发生转变。中国的工业企业经过近几十年的发展&#xff0c;自动化、信息化&#xff0c;以及一些基础的数据系统建设在不同的行业中慢慢地推进。近几年&#xff0c;工业企业…

STM32CubeMX配置STM32G031多通道UART+DMA收发数据(HAL库开发)

时钟配置HSI主频配置64M 配置好串口&#xff0c;选择异步模式 配置DMA TX,RX,选择循环模式。 NVIC中勾选使能中断 勾选生成独立的.c和h文件 配置好需要的开发环境并获取代码 串口重定向勾选Use Micro LIB main.c文件修改 增加头文件和串口重定向 #include <string.h&g…

C++ 基本字符转换

宽字符和窄字符的概念 宽字符和窄字符是与字符编码相关的概念&#xff0c;通常在处理多语言字符时会涉及到这些概念。 窄字符&#xff08;Narrow Character&#xff09;&#xff1a; 窄字符通常指的是单字节字符&#xff0c;使用单个字节来表示一个字符。在ASCII编码中&#…

第三节课作业

复现&#xff1a; 对mmagic的理解