生产问题(十二)GC垃圾回收导致空指针

news2024/11/15 23:56:21

一、引言

        最近线上出现由于线程池任务执行超时导致的空指针,按道理说基本不会很多执行超时的,看了看监控,那个时间点发生了gc,gc时间超过5s。

        说明这次是gc垃圾回收导致的问题,实际上需要排查解决的是垃圾回收问题。表象总是和实际的原因差距很大。

7ac954103e0a40f6a7d0ac8d775de19e.png

二、环境

        操作系统、容器环境没什么好说的,主要是GC相关的

        jvm参数:

-Xmx12288m -Xms12288m -Xss256k -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m -XX:MaxGCPauseMillis=200 -XX:+UseG1GC -XX:-OmitStackTraceInFastThrow -XX:MinHeapFreeRatio=30 -XX:MaxHeapFreeRatio=50 -Djava.util.concurrent.ForkJoinPool.common.parallelism=4 -XX:CICompilerCount=3 -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m  -XX:ActiveProcessorCount=4 -XX:+PreserveFramePointer -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=32M -XX:+HeapDumpOnOutOfMemoryError 

        gc收集器是g1

        最大堆大小:12288.00 MB

        最大非堆大小:1256.00 MB

        g1是整堆收集,收集他定义的region策略。所以监控上所有的gc时间都给到了young gc,达到5s,是让同事很疑惑的。其实监控显示的不太对,属于汇总时间。

b24045f16d434e5a94d3c53d4ab5cd82.png

三、分析-TCP丢包

        这个方向实际对不上这个问题,只是有一些特征显示有这种可能,后面被其他机器的现象排除了。

        但是这个猜测方向有没有必要呢,当然是有的。发现问题去排查解决本来就是根据原理先提出一些方向,对这些方向进行论证,排除错误的方向,留下可能的方向再去找依据支持这个论点,再通过实验解决问题。

        即使一个方向对不上这次的问题,只要他的理论没有问题,他就可能在下一次映射在其他的问题上。老话说的好:大胆猜测,小心求证。

1、丢包监控

        作者为什么会产生丢包影响gc的猜测呢?因为在监控上显示在对应的时间点发生了tcp丢包重传的问题,监控拉长之后这个突峰也是非常明显。

        但是这个现象为什么会联系到gc延长的问题呢?作者是这样思考的:TCP丢包重传默认上1s,如果是本来很快结束的请求因为重传而迟迟不结束,那么这个处理任务相关的所有对象都不能释放,不能被gc回收。      

        这也是之前作者的经验,丢包导致了请求延长,有兴趣的同学可以看看之前发生的问题

生产问题(五)TCP丢包排查_tcp connection lost怎么排查-CSDN博客

生产问题(五)TCP丢包解决_tcp丢包的解决方案-CSDN博客

95bac654e26145b79580538bcf320b2f.png

2、TCP参数

        有了猜测就看看当前的设置是不是这样,说不定重传设置的很低呢,在机器上输入

sysctl -a

        查看一下重传的retrans参数,的确是1s

c3c967810a1b42449f241397d317a162.png

3、其他机器

        接下来需要确认其他机器,是不是所有的发生这种gc延长的机器和对应的时间都有丢包重传的现象。

        很明显,作者发现其他机器或者其他时间点都没有,那就不是这个原因。也幸好有多个机器、多个时间点,不然这个可能性不能排查,也就需要更多的验证。

四、分析-GC日志

        工具还是挺全的,在机器发布的时候就会生成一份GC日志,后续不断写入,所以可以看到当时发生了什么。

        基本上每一个对应的机器和时间点都看到了Evacuation Failure,在region复制转移的时候,对象分配失败了,to-space exhausted也是一个比较明显的特征

67fdb8be43274c2b8da674e027b18018.png

五、分析-GC调优 

1、G1ReservePercent

        G1ReservePercent没有设置,那就是默认的10%预留空间给存活对象转移,这个比例是相对于整堆的,那么预留空间就有1.2g左右,这个看起来也是满了,因为Heap: 12115.1M(12288.0M)->10604.0M(12288.0M)。

        那么要不要调大G1ReservePercent呢,作者感觉是不需要的,1.2g不少了,这样还不行,再调大也没什么用处。比例应该没什么问题。

2、G1HeapRegionSize

         G1HeapRegionSize没有设置,通常情况下,G1 会将堆内存划分为 2048 个 Region,我们堆内存的大小为 12G ,那么每个 Region 的大小为 6MB左右。那么超过1/2Region大小的都会作为大对象准备放入Humongous区域,对象的大小为Region的几倍,会使用多个连续的Humongous区域来存储这个大对象。

        再结合当前的处理任务会产生大对象,每个大对象都会达到几十M,如果是region里面分配不下,然后需要整合几个Humongous存放,为了能找到连续的H区,有时候不得不启动Full GC,那么就比较符合这个现象了。

       这样看来就可以调整G1HeapRegionSize,把region放大,免得这些大对象放不下,需要整合多个Humongous。

六、总结

        这一次的问题涉及到网络、jvm、gc多方面的知识,需要经过多种原理剖析论证,锁定了方向之后就需要实验了,作者后续会把实验结果同步。

        发现问题去排查解决本来就是根据原理先提出一些方向,对这些方向进行论证,排除错误的方向,留下可能的方向再去找依据支持这个论点,再通过实验解决问题。

        即使一个方向对不上这次的问题,只要他的理论没有问题,他就可能在下一次映射在其他的问题上。老话说的好:大胆猜测,小心求证。有了解的同学也可以谈谈自己的想法,给我们多一些验证方向。

 

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

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

相关文章

element plus 表格el-table行多选单选

1 行多选-点击checkbox 添加一个 el-table-column&#xff0c;设 type 属性为 selection 即可 <template><div class"box"><el-table :data"tableData" selection-change"handleSelectionChange"><el-table-column type&…

vue3 使用<script lang=“ts“ setup>加上lang=“ts“后编译错误

报错信息 报错原因 加上了langts解决 下载typescript和loader npm install typescript ts-loader --save-dev配置vue.config.js 添加下面的代码 configureWebpack: { resolve: { extensions: [".ts", ".tsx", ".js", ".json"] }…

【Linux】冯诺依曼体系结构与操作系统及其进程

> 作者简介&#xff1a;დ旧言~&#xff0c;目前大二&#xff0c;现在学习Java&#xff0c;c&#xff0c;c&#xff0c;Python等 > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;了解冯诺依曼体系结构与操作系统&#xff0c;掌握…

基础数据结构(1):链表

在学习算法时&#xff0c;发现用什么数据结构来存储数据是很重要的&#xff0c;所以学习数据结构也是必须的&#xff0c;先从基础数据结构&#xff1a;数组&#xff0c;字符串&#xff0c;链表&#xff0c;栈&#xff0c;队列&#xff0c;树&#xff0c;矩阵&#xff0c;邻接表…

3D小球跑酷

目录 一、前言 二、开发环境 三、场景搭建 1. 创建项目 2. 创建场景内物体 2.1 创建跑道 2.2 创建玩家 2.3 创建障碍物 2.4 改变跑道和障碍物的颜色 2.4.1 创建材质 2.4.2 给跑道和障碍物更换材质 四、功能脚本实现 1. 创建玩家脚本 2. 相机跟随 3. 胜负的判定 3…

spring boot版本升级遇到的一些问题

背景&#xff1a;由于项目需求&#xff0c;需要将nacos 1.4.6版本升级到2.x版本&#xff0c;由此引发的springboot、springcloud、springcloud Alibaba一系列版本变更。 旧版本分别为&#xff1a; Spring Boot 2.3.5.RELEASE Spring Cloud Hoxton.SR9 Spring Cloud Alibaba 2.2…

基于RocketMQ实现分布式事务

前言 在上一篇文章Spring Boot自动装配原理以及实践我们完成了服务通用日志监控组件的开发&#xff0c;确保每个服务都可以基于一个注解实现业务功能的监控。 而本文我们尝试基于RocketMQ实现下单的分布式的事务。可能会有读者会有疑问&#xff0c;之前我们不是基于Seata完成了…

让AIGC成为你的智能外脑,助力你的工作和生活

人工智能成为智能外脑 在当前的科技浪潮中&#xff0c;人工智能技术正在以前所未有的速度改变着我们的生活和工作方式。其中&#xff0c;AIGC技术以其强大的潜力和广泛的应用前景&#xff0c;正在引领着这场革命。 AIGC技术是一种基于人工智能的生成式技术&#xff0c;它可以通…

SQL 的执行顺序,你搞清楚了吗?

这是一条标准的查询语句: 这是我们实际上SQL执行顺序&#xff1a; from 子句组装来自不同数据源的数据&#xff1b;where 子句基于指定的条件对记录行进行筛选&#xff1b;group by 子句将数据划分为多个分组&#xff1b;使用聚集函数进行计算&#xff1b;使用 having 子句筛选…

【Python必做100题】之第二十二题(复制列表)

题目&#xff1a;将一个列表的数据复制到另一个列表中 重点&#xff1a;确保复制到位要导入copy方法进行深度复制 代码如下&#xff1a; #将一个列表的数据复制到另一个列表中 import copy list [1,2,3,4] print(list) list1 copy.copy(list) list[0] 30 print(list) pri…

CentOS:Docker 创建及镜像删除

1、安装docker 远程连接服务器&#xff0c;可以直接下载netsarang比较好用 家庭/学校免费 - NetSarang Website 如果有残留docker未删除干净&#xff0c;请使用 sudo yum -y remove docker docker-common docker-selinux docker-engine Step1&#xff1a;安装必要的一些…

docker 安装及配置 nginx + tomcat(四):高可用

文章目录 1. 引言2. 高可用架构3. 实际步骤3.1 虚拟机新建系统3.2 安装 keepalived3.3 配置 keepalived3.4 启动 keepalived3.5 验证高可用3.5.1 查看当前效果3.5.2 模拟灾难 4 参考 1. 引言 前情提要&#xff1a; 《docker 安装及配置 nginx tomcat&#xff08;一&#xff0…

2.vue学习(8-13)

文章目录 8.数据绑定9.el与data的2种写法10.理解mvvm11.object.defineProperty12. 理解数据代理13 vue中的数据代理 8.数据绑定 单向数据绑定就是我们学的v-bind的方式&#xff0c;vue对象变了&#xff0c;页面才变。但是页面变了&#xff0c;vue对象不会变。 双向数据绑定需要…

项目经理和产品经理的区别,如何判断自己适合哪个,从事该岗位前期需做的准备(学习技能考、哪些证书)?

最近很多人咨询“项目经理跟产品经理该怎么选&#xff0c;我更适合哪个&#xff1f;”“项目经理跟产品经理哪个更有钱途 ”“项目经理转产品经理好转吗”等等&#xff0c;今天就一次性说清楚项目经理跟产品经理有什么区别&#xff0c;应该怎么选择。 不想看长篇大论的&#x…

[计网02] 数据链路层 笔记 总结 详解

目录 数据链路层概述 主要功能 封装成帧 透明传输 差错检测 冗余码 差错控制 检错编码 纠错编码 奇偶效验法 CRC循环冗余码 静态分配信道 频分多路复用FDM 时分多路复用TDM 波分多路复用WDM 码分多路复用CDM 随机访问介质的访问控制 ALOHA CSMA CSMA/CD CSMA/…

关于“Python”的核心知识点整理大全30

目录 12.2.3 在 OS X 系统中安装 Pygame 12.2.4 在 Windows 系统中安装 Pygame 12.3 开始游戏项目 12.3.1 创建 Pygame 窗口以及响应用户输入 首先&#xff0c;我们创建一个空的Pygame窗口。使用Pygame编写的游戏的基本结构如下&#xff1a; alien_invasion.py 12.3.2 设…

零刻EQ12 N100 双2.5G网口 All In One新手教程

零刻EQ12 N100 双2.5G网口 All In One新手教程 前言1.硬件配置2.准备工作2.1. ESXI8.0U2镜像2.2. Rufus磁盘工具下载2.3. ikuai镜像下载2.4. StarWindConverter虚拟磁盘格式转换工具下载2.5. OpenWrt镜像下载2.6. 黑群晖RR引导镜像下载(DSM7.2)2.7. 需要准备的硬件2.8. 格式化需…

【C语言(十五)】

动态内存管理 一、为什么要有动态内存分配? 我们已经掌握的内存开辟方式有&#xff1a; int val 20 ; // 在栈空间上开辟四个字节 char arr[ 10 ] { 0 }; // 在栈空间上开辟 10 个字节的连续空间 但是上述的开辟空间的方式有两个特点&#xff1a; • 空间开辟大小是固…

vCenter HA拆分和部署

原创作者&#xff1a;运维工程师 谢晋 vCenter HA拆分和部署 拆分vCenter HA部署vCenter HA 拆分vCenter HA 客户vCenter HA内一台虚拟机出现故障无法连接&#xff0c;报错如下&#xff1a; 点击移除集群报错如下&#xff1a; 查找官方KB&#xff0c;按照官方KB进行移除…

货仓选址

title: 货仓选址 date: 2023-12-19 15:06:02 tags: 排序 categories: 算法进阶指南 题目大意 解题思路 将数组排序后&#xff0c;将货仓建在 x x x 坐标处&#xff0c;其左侧和右侧的商家数量相同的时候最优 实现代码 #include<bits/stdc.h>using namespace std; type…