内存泄漏调优案列

news2024/11/24 6:09:25

案列背景

最近在做公司项目核心接口压测和稳定性压测时,各接口的成功率不足99.99%,通过分割压测之后发现,在压测A服务时,内存上升明显,且伴有频繁的fgc发生

 jvm老年代内存使用率已经达到了100%且应用的fgc有5000+次,fgc频率大概在2s左右,怀疑有内存泄漏问题产生

压测工具tps表现和现象

内存飙升导致频繁的fgc,导致在压测时出现tps不稳定现象,出现毛刺现象

 Tps火焰图如下:

 

排查过程

内存dump,Mat分析

出现内存100%之后,将A服务的内存dump文件拿到之后,使用MAT工具分析,mat显示如下:

从MAT工具上显示,有大量的SessionImpl对象存在,怀疑内存泄漏发生在此处

源码追踪 

通过跟踪源码,找到了InMemorySessionManager相关代码,并跟踪到了SessionImpl实例类代码如下:

调用处:

 

在哪里调用了InMemorySessionmanager#createSession方法? 

此时发现有多出地方会调用该方法,无法确定是由哪里导致Session创建的

额外发现 

通过使用jstat -gcutil 1 1000观察A服务的pod内存和gc情况,当压测一段时间之后停止压测,观察一段时间,发现pod的内存会逐步往下掉,最终内存会回退到正常范围,怀疑有SessionImpl过期清除机制。同时,在以上InMemorySessionManager代码中发现了如下方法:

 

此处会定期清理session对象。

跟踪整个调用栈:

SessionImpl#maxInactiveInterval--->InMemorySessionManager#defaultSessionTimeout=30*60

InMemorySessionManager提供了方法setDefaultSessionTimeout方法可以修改此处属性

在UndertowServletWebServerFactory中有关于session的超时设置

 为此,查询springboot自动装配关于session过期的设置:

为了验证是否是由于该处设置引起的,增加关于session过期的设置,并且设置过期时间10s,再次压测:

此时,内存的上升速度没变,但是每次经过fgc

(cms垃圾收集器-XX:CMSInitiatingOccupancyFraction=70),内存回退到正常状态

SessionImpl是有哪里创建的

通过对比不同的服务之前的内存增长差异情况,发现之后A会出现如上内存快速增长情况。再结合session过期设置的验证效果,查询了A的业务代码发现如下代码:

 

其中@ModelAttribute注解使用在方法上时,会在每次调用Control的方法前都会调用,注意到:

this.session = request.getSession();跟踪代码,发现最终会调用到InMemorySessionManager#getSession方法创建大量的SessionImpl存入到Sessions(一个ConcurrentHashMap)

至此,内存泄漏的最终元凶找到了

 

再次验证

 在A服务中,去掉对BaseController的继承,再次压测心跳接口,此时应用内存和gc恢复正常

总结

1 确定内存泄漏对象

出现内存泄漏问题,首先获取服务内存映射(当让也可以使用:(jmap  -histo:live   1 |head -20查看内存大对象),然后查看内存类。

2 分析代码,查询资料,确定泄漏来源

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

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

相关文章

离散数学与组合数学-02二元关系上

文章目录离散数学与组合数学-02二元关系上2.1 序偶和笛卡尔积2.1.1 有序组的定义2.1.2 笛卡儿积笛卡儿积的性质2.2 关系的定义2.2.1 二元关系定义与案例2.2.2 二元关系的数学符号定义案例枚举二元关系2.2.3 定义域和值域2.2.4 二元关系概念的推广2.3 关系的表示2.3.1 集合表示法…

RS-485/RS-422收发器芯片DP3085 兼容替代MAX3085EESA

什么是RS-485 典型的串行通讯标准是RS232和RS485,它们定义了电压,阻抗等,但不对软件协议给予定义。RS-485总线标准规定了总线接口的电气特性标准即对于2个逻辑状态的定义:正电平在2V~6V之间,表示一个逻辑状态&#xf…

【基于动态内存+文件操作】通讯录管理系统

前言 每一个项目文件的功能说明 打印基本菜单1.创建一个适合存放联系人信息的结构体和通讯录结构体2.初始化通讯录(加载上次的联系人,检查容量是否充足) 枚举常量内部内容 (1)增加联系人信息 (2)删除某个联系人信息 (3)查找联系人信息 …

CY5.5-Dextran Cy5.5菁染料标记葡聚糖

产品名称:荧光Cy5.5菁染料标记葡聚糖 英文名称:CY5.5-Dextran 外观状态:紫色粉末 质量:90% 荧光波长:684nm-710nm 溶解性Dextran葡聚糖(右旋糖酐Dextran),是一类具支链葡萄糖高聚物,…

系分 - 案例分析 - 需求分析(FAST分析)

个人总结,仅供参考,欢迎加好友一起讨论 文章目录案例分析 - 需求分析(FAST分析)FAST1 范围定义2 问题分析鱼骨图帕累托图制定系统改进目标3 需求分析定义需求PIECES方法4 逻辑设计5 决策分析6 物理设计和集成/构造和测试/安装和发…

考虑写出一个不抛异常的swap 函数

目录 一.标准库中的swap函数 二.针对于非模板类,设计全特化的std::swap() 三.针对模板类 四.合理使用using 五.swap成员函数不能抛出异常 六.swap函数总结 一.标准库中的swap函数 在C11中有move函数,它可以是一个左值变为右值,在许多场…

mybatis进阶

Mybatis的各种查询功能 MyBatis的各种查询功能: * 1、若查询出的数据只有一条 * a>可以通过实体类对象接收 * b>可以通过list集合接收 * c>可以通过map集合接收 * 结果:{password123456, sex男, id3, age23, email12345qq.com, usernameadmin} …

STM32 按键模块化

文章目录前言一、按键的原理图二、按键的GPIO配置总结前言 本篇文章将继续带大家学习模块化编程,今天主要给大家讲解按键的模块化。 一、按键的原理图 我们可以看到按键分别接到了板子的PE3和PE4引脚。 按键的具体原理这里我就不多讲了,大家可以看我之…

星光starfive2开发板的gpio使用

starfive2开发板是riscv平台不错的板子。 发展非常快。在starfive1的基础上有大量的改进和提升。 板子上的GPIO引脚定义是这样定义的:如下图所示 右侧6,8,10是调试用的串口,跟树莓派是一致的。 GPIO引脚的编号跟树莓派不一样。…

Java多线程:多线程同步安全问题的 “三“ 种处理方式 ||多线程 ”死锁“ 的避免 || 单例模式”懒汉式“的线程同步安全问题

Java多线程:多线程同步安全问题的 “三“ 种处理方式 ||多线程 ”死锁“ 的避免 || 单例模式”懒汉式“的线程同步安全问题 每博一文案 常言道:“不经一事,不懂一人”。 一个人值不值得交往,在关键时候才能看得清。看过这样的一个…

ESP32设备驱动-HMC5883L磁场传感器驱动

HMC5883L磁场传感器驱动 1、HMC5883L介绍 霍尼韦尔 HMC5883L 是一款表面贴装、多芯片模块,专为低场磁场传感而设计,具有数字接口,适用于低成本罗盘和磁力计等应用。 HMC5883L 包括我们先进的高分辨率 HMC118X 系列磁阻传感器和一个 ASIC,该 ASIC 包含放大、自动消磁带驱动…

二叉平衡树之AVL树【手动实现代码】

目录 1、AVL树的概念 2、AVL树定义节点 3、AVL树的插入 4、AVL树的旋转 4.1、新节点插入较高左子树的左侧——右单旋 4.2、新节点插入较高右子树的右侧——左单旋 4.3、新节点插入较高左子树的右侧——左右双旋 4.4、新节点插入较高右子树的左侧——右左双旋 5、AVL树…

【LeetCode】1807. 替换字符串中的括号内容

1807. 替换字符串中的括号内容 题目描述 给你一个字符串 s ,它包含一些括号对,每个括号中包含一个 非空 的键。 比方说,字符串 “(name)is(age)yearsold” 中,有 两个 括号对,分别包含键 “name” 和 “age” 。 你…

2023 年 The Sandbox 生态系统将迎来什么?

2022 年对于 The Sandbox 来说是多么美好的一年!不仅是对我们的团队来说,对所有与我们建立业务的合作伙伴、才华横溢的创作者、工作室和代理机构来说也是这样。感谢大家让今年最喜欢的时刻成为现实,并成为这个社区的一部分。我们正在共同构建…

25w粉拿下1600w播放,仅用一周时间出圈B站!

2022年,B站举办了第四次跨年晚会《最美的夜》,艾薇儿登台唱起《Complicated》的瞬间,B站跨晚的直播间人气峰值到达3亿。在过去的一年里,平台持续变化带来亮眼成绩,月活用户破3亿、直播开通购物专区、竖屏模式增长播放等…

LaoCat带你认识容器与镜像(四【上】)

Dockerfile是实际项目生产中,比较常用的一个知识点,故也准备分成上下俩节来讲解。 本章内容 如何查询相关Dockerfile与Dockerfile基础命令介绍 本文实操全部基于Ubuntu 20.04 宿主机 > linux服务器本身 业务不断的扩充累积中,大多数企业应…

Python import自定义模块报错、自定义异常、字符串处理、截取

一、python import自定义的模块报错 问题现象:pycharm中运行一切正常,但是到命令行中(cmd命令行或pycharm的Terminal窗口)运行py文件,就会报错No module named xxx 问题原因: pycharm在每次运行时&#x…

【C进阶】指针的进阶

家人们欢迎来到小姜的世界&#xff0c;<<点此>>传送门 这里有详细的关于C/C/Linux等的解析博客&#xff0c;家人们赶紧冲鸭&#xff01;&#xff01;&#xff01; 客官&#xff0c;码字不易&#xff0c;来个三连支持一下吧&#xff01;&#xff01;&#xff01;关注…

祝大家兔年 新春快乐Happy new year

春节&#xff0c;也被称为农历新年。对于中国人来说&#xff0c;这是规模最大&#xff0c;最重要的传统节日。The Spring Festival is also called Chinese Lunar New Year. Being one of the traditional Chinese festivals, it is the grandest and most important festival …

Ue4 Insights的使用

1.运行UnrealInsights.exe 2.执行独立进程或者打包exe 这时会发现Insights自动创建并开始运行了一个Trace Sessions&#xff0c;持续记录到.utrace文件中 .utrace文件路径 3.也可以通过连接IP地址&#xff0c;获取到该计算机的UE程序。状态为LIVE实时 4.点击右下角Open按钮…