【实战场景】记一次UAT jvm故障排查经历

【实战场景】记一次UAT jvm故障排查经历

  • 开篇词:
  • 干货篇:
      • 1.查看系统资源使用情况
      • 2.将十进制进程号转成十六进制
      • 3.使用jstack工具监视进程的垃圾回收情况
      • 4.输出指定线程的堆内存信息
      • 5.观察日志
      • 6.本地环境复现
  • 总结篇:
  • 我是杰叔叔,一名沪漂的码农,下期再会!

开篇词:

故障背景是客服中心通话历史分表4季度,单表200w+,查询一年的数据量,大分页(查询第20w页的10条数据)查询多次,tomcat卡死,一段时间后,后台其他定时任务,kafaka消费线程恢复正常,tomcat web容器依旧高cpu,具卡无比。

干货篇:

1.查看系统资源使用情况

top -H -p 49339
解释:查看进程49339进程的实时系统资源使用情况,“-H”表示查看进程中所有线程资源占用情况; “-p”指用来指定具体进程号

2.将十进制进程号转成十六进制

printf “%x \n” 49339
解释:转换的目的是让这个线程ID能和jstack输出的线程ID匹配上,因为jstack输出的是十六进制的线程ID

3.使用jstack工具监视进程的垃圾回收情况

jstat -gc 49339 3 5
解释:通过jstat工具查看jvm 垃圾回收情况,“-gc”指定要监视的内容为垃圾回收情况;“3”每隔三秒输出一次监视结果;“5”一共输出5次监视结果。
在这里插入图片描述

其中各参数代表的含义:

  • S0C (Survivor space 0 capacity):第一个幸存区(Survivor space)的容量(以字节为单位)。幸存区用于存放垃圾收集后存活的对象。
  • S1C (Survivor space 1 capacity):第二个幸存区的容量(以字节为单位)。在大多数 JVM 实现中,幸存区有两个,用于在不同的垃圾收集周期之间切换。
  • S0U (Survivor space 0 utilization):第一个幸存区当前已使用的空间大小(以字节为单位)。
  • S1U (Survivor space 1 utilization):第二个幸存区当前已使用的空间大小(以字节为单位)。
  • EC (Eden space capacity):Eden 区的容量(以字节为单位)。Eden 区是 Java 堆的一部分,用于存放新生成的对象。
  • EU (Eden space utilization):Eden 区当前已使用的空间大小(以字节为单位)。
  • OC (Old space capacity):老年代(Old Generation)的容量(以字节为单位)。老年代用于存放存活时间较长的对象。
  • OU (Old space utilization):老年代当前已使用的空间大小(以字节为单位)。
  • MC (Metaspace capacity):元空间(Metaspace,Java 8 引入以替代永久代)的容量(以字节为单位)。元空间用于存放类的元数据。
  • MU (Metaspace utilization):元空间当前已使用的空间大小(以字节为单位)。
  • CCSC (Compressed class space capacity):压缩类空间(Java 8+ 中使用)的容量(以字节为单位)。这个空间用于存放类的元数据,但与元空间分开管理。
  • CCSU (Compressed class space utilization):压缩类空间当前已使用的空间大小(以字节为单位)。
  • YGC (Young GC count):年轻代垃圾收集的次数。
  • YGCT (Young GC time):年轻代垃圾收集所花费的总时间(以秒为单位)。
  • FGC (Full GC count):完全垃圾收集(Full GC,也称作老年代垃圾收集)的次数。
  • FGCT (Full GC time):完全垃圾收集所花费的总时间(以秒为单位)。
  • GCT (Total GC time):垃圾收集所花费的总时间(以秒为单位),包括年轻代和完全垃圾收集的时间。
    请注意,具体的输出参数可能会因 JVM 的版本和配置(如是否启用了压缩指针等)而有所不同。此外,对于 JDK 11 及更高版本,元空间(Metaspace)取代了永久代(PermGen space),因此相关的参数(如 PC 和 PU)在较新版本的 JVM 中不再出现。

4.输出指定线程的堆内存信息

jmap -heap 49339
解释:输出指定线程的堆内存信息
在这里插入图片描述

jstack -l 49339|grep c22a -A 20
解释:时候用jstack工具来输出java进程的线程堆栈信息,并查找包含字符串“c22a”的行,打印其后面的20行
“-l”:指定输出java进程的线程ID;“-A 20”:打印匹配行及其后面的20行

5.观察日志

发现kafka消费线程占用cpu较高,kafka consumer正常epollWait等待kafaka数据,无其他特别异常信息,暂时跳过

6.本地环境复现

更换jdbc连接池至druid,通过dashboard排查分表后的真实sql耗时,中等数据量时,由于分表的存在,limit 20w,20w+10会被重写0,20W+10,以便跨表数据内存排序,数据量大,便造成了慢查询,有可能导致OOM

总结篇:

以下是大致的排查JVM问题的思路:

  1. 初步观察和监控
    查看系统指标:使用系统监控工具(如Linux的top命令或Windows的任务管理器)查看CPU、内存和网络IO等关键指标。
    观察JVM监控工具:使用JDK自带的工具如jConsole、VisualVM或第三方工具(如Arthas)来远程连接并监控JVM的内存使用趋势、线程状态、垃圾回收活动等。
  2. 确定问题类型
    内存问题:观察是否出现OutOfMemoryError(OOM)错误,或者内存使用量异常增长。
    CPU问题:查看CPU使用率是否过高,特别是某个或某些Java线程的CPU占用率异常。
    线程问题:检查是否存在死锁、线程饥饿或线程阻塞等问题。
    垃圾回收问题:分析垃圾回收日志,查看垃圾回收的频率、时间和类型,判断是否存在频繁的Full GC或GC时间过长等问题。
  3. 使用诊断工具
    jstack:用于打印Java线程的堆栈跟踪信息,帮助定位线程问题,如死锁、线程阻塞等。
    示例命令:jstack ,其中是Java进程的进程ID。
    jmap:用于生成堆内存快照和查询堆内存使用情况。
    示例命令:jmap -heap 查看堆内存使用情况,jmap -dump:live,format=b,file=.hprof 生成堆内存快照。
    jstat:用于监视JVM中类的加载、内存、垃圾收集、JIT编译等运行时数据。
    示例命令:jstat -gc 1000每1000毫秒打印一次GC信息。
    jcmd(JDK 1.8+):集成了多个JDK诊断命令的功能,用于执行更复杂的诊断任务。
    示例命令:jcmd Thread.print打印线程信息。
  4. 分析日志和堆内存快照
    分析GC日志:通过GC日志分析垃圾回收的频率、时间、类型和原因,判断是否存在内存泄漏、堆内存设置不合理等问题。
    分析堆内存快照:使用MAT(Memory Analyzer Tool)等内存分析工具分析堆内存快照,查找内存泄漏的源头、大对象占用等。
    查看应用程序日志:检查应用程序日志以获取更多关于错误和异常的上下文信息。
  5. 定位和解决问题
    代码优化:根据分析结果优化代码,减少内存占用、避免内存泄漏、优化数据结构等。
    JVM参数调整:调整JVM启动参数,如堆内存大小(-Xms,-Xmx)、垃圾回收器类型(-XX:+UseG1GC)等,以改善JVM性能。
    升级JDK版本:如果问题是由于JDK的已知bug引起的,考虑升级到更高版本的JDK。
  6. 验证和监控
    验证修复:在开发或测试环境中验证修复是否有效,确保问题得到解决。
    持续监控:在问题解决后,持续监控系统性能,确保没有新的问题出现。

通过以上步骤,可以系统地排查和解决JVM问题,提高系统的稳定性和性能。需要注意的是,排查JVM问题可能需要一定的经验和耐心,因为问题可能由多种因素引起,需要综合考虑各种信息来找到问题的根源。

在这里插入图片描述

我是杰叔叔,一名沪漂的码农,下期再会!

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

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

相关文章

Objective-C使用块枚举的细节

对元素类型的要求 在 Objective-C 中,NSArray 只能存储对象类型,而不能直接存储基本类型(例如 int)。但是,可以将基本类型封装在 NSNumber 等对象中,然后将这些对象存储在 NSArray 中。这样,en…

H6922 便携移动储能升压恒压方案 2.8-40V耐压 7.5A大电流应用芯片IC

H6922芯片是一款便携移动储能升压恒压控制驱动芯片,满足2.8-40V宽输入电压范围的升压恒压电源应用而设计。下面我将基于您提供的信息,对H6922的特性和典型应用进行更详细的解释。 产品特性详解 宽输入电压:H6922支持2.8-40V的宽输入电压范围…

【Windows】Visual Studio Installer下载缓慢解决办法

【Windows】Visual Studio Installer下载缓慢解决办法 1.背景2.分析3.结果 1.背景 使用visual studio在线安装包进行IDE安装,发现下载几乎停滞,网速几乎为零。 经过排查并不是因为实际网络带宽导致。 这里涉及DNS知识; DNS(Dom…

SCI丨5分期刊,JCR一区

SCI,5分,JCR Q1,中科大类3小类2区 1 基于复杂网络与xxx能源汽车节能数值分析 2 基于热能损失优化的xxx与性能管理 3 基于xxxLCA技术的绿色制造工艺优化研究 4 基于xxx入侵检测技术的物联网智能制造监控系统设计 6 基于物联网技术xxx电力系…

BMP280 环境传感器

型号简介 BMP280是博世(bosch-sensortec)的一款气压传感器,特别适用于移动应用。其小尺寸和低功耗使其能够应用于电池供电的设备,如手机、GPS 模块或手表。基于博世久经考验的压阻式压力传感器技术,具有高精度和线性度…

Elasticsearch备份数据到本地,并导入到新的服务 es 服务中

文章目录 使用elasticsearch-dump工具备份安装node.js(二进制安装)解压设置环境变量安装elasticsearch-dump docker安装使用ES备份文件到本地 使用elasticsearch-dump工具备份 这个工具备份时间比较长 安装node.js(二进制安装) wget https://nodejs.org/dist/v16.18.0/node-…

SpringBoot: Eureka入门

1. IP列表 公司发展到一定的规模之后,应用拆分是无可避免的。假设我们有2个服务(服务A、服务B),如果服务A要调用服务B,我们能怎么做呢?最简单的方法是让服务A配置服务B的所有节点的IP,在服务A内部做负载均衡调用服务B…

基于FPGA的DDS信号发生器

前言 此处仅为基于Vivado实现DDS信号发生器的仿真实现,Vivado的安装请看下面的文章,这里我只是安装了一个标准版本,只要能够仿真波形即可。 FPGA开发Vivado安装教程_vivado安装 csdn-CSDN博客 DDS原理 DDS技术是一种通过数字计算生成波形…

图解 Kafka 架构

写在前面 Kafka 是一个可横向扩展,高可靠的实时消息中间件,常用于服务解耦、流量削峰。 好像是 LinkedIn 团队开发的,后面捐赠给apache基金会了。 kafka 总体架构图 Producer:生产者,消息的产生者,是消息的…

排序算法系列一:选择排序、插入排序 与 希尔排序

目录 零、说在前面 一、理论部分 1.1:选择排序 1.1.1:算法解读: 1.1.2:时间复杂度 1.1.3:优缺点: 1.1.4:代码: 1.2:插入排序 1.2.1:算法解读&#x…

上位机图像处理和嵌入式模块部署(mcu 项目1:上位机编写)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 前面,我们说过要做一个报警器。如果只是简单做一个报警器呢,这个基本上没有什么难度。这里,我们就适当提高一下…

某业帮六月校招后端笔试

题目一 解题思路 签到题,dp就行。 题目二 解题思路 这个比较烦人,需要处理额外的引号和括号。用DFS,对于每个间隙,插入与不插入都搜一遍。 题目三 解题思路: 双指针,左右各一个指针,对比长度&…

如何在Python中拷贝类对象到数组

1、问题背景 在Python中,我们经常需要存储多个对象的集合。有时,我们需要拷贝这些对象,以便在不修改原始对象的情况下对它们进行操作。例如,在下述代码中,我们在colors列表中存储了多个Color对象,然后我们创…

单线激光雷达-多线激光雷达安装测试

单线激光雷达思岚 S 系列 参数简介 单线激光雷达的参数,主要看扫描频率(Hz),扫描范围(度),最大测距距离(m)以及单 圈点数)。机器人运动速度越快&#xff0c…

Windows系统安装NVM,实现Node.js多版本管理

目录 一、前言 二、NVM简介 三、准备工作 1、卸载Node 2、创建文件夹 四、下载NVM 五、安装NVM 六、使用NVM 1、NVM常用操作命令 2、查看NVM版本信息 3、查看Node.js版本列表; 4、下载指定版本Node.js 5、使用指定版本Node.js 6、查看已安装Node.js列…

《后端程序猿 · 基于 Lettuce 实现缓存容错策略》

📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗 🌻 近期刚转战 CSDN,会严格把控文章质量,绝不滥竽充数,如需交流&#xff…

在卷积神经网络(CNN)中为什么可以使用多个较小的卷积核替代一个较大的卷积核,以达到相同的感受野

在卷积神经网络(CNN)中为什么可以使用多个较小的卷积核替代一个较大的卷积核,以达到相同的感受野 flyfish 在卷积神经网络(CNN)中,可以使用多个较小的卷积核替代一个较大的卷积核,以达到相同的…

用MySQL+node+vue做一个学生信息管理系统(一):配置项目

先用npm init -y生成配置文件 在项目下新建src文件夹,app.js文件。src目录用来放静态资源文件,app.js是服务器文件,index.js是vue的入口文件 使用npm install express下载express框架 在app.js文件夹开启node服务,监听的端口为…

鸿蒙开发设备管理:【@ohos.multimodalInput.touchEvent (触摸输入事件)】

触摸输入事件 设备上报的触屏事件。 说明: 本模块首批接口从API version 9开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 导入模块 import {Action,ToolType,SourceType,Touch,TouchEvent} from ohos.multimodalInput.touchEvent;…

FL Studio 21.0.3.3517中文破解版2024最新Keygen免费下载安装激活教程

你们是否也是音乐制作爱好者呢?如果是,那就仔细阅读文章收集对自己有帮助的操作技巧吧~~ FL Studio 21.2.3 Win-安装包下载如下: https://wm.makeding.com/iclk/?zoneid55981 FL Studio 21 .2.3Mac-安装包下载如下: https://wm.makeding.com/iclk/?…