记一次内存泄漏问题的排查

news2024/11/17 7:47:15

阶段一:
前段时间,突然发现服务在毫无征兆的情况下发生了重启。去看了一下容器退出的日志,发现内存利用率超过了100%,导致容器重启,进一步看了skyWalking,发现heap内存超了,当时只是简单的以为是流量上涨导致CPU和内存资源不足,所以增加了相应的配置,同时启动命令中增大了指定的堆内存大小。

阶段二:
在做了阶段一的相应变更之后,没过多久,再次发生了服务重启现象,感觉应该是内存泄漏,因为将skyWalking监控时长拉长到以天为单位,发现heap大小一直呈现一个上涨的斜线,说明内存没有被回收掉。如果以分钟为间隔,则看到内存大小是一个波动的线条,发现不了问题。
初步检查代码,发现了一个问题,在线程中传递上下文信息时,用到了MDC,这个类背后其实是ThreadLocal类,但是在使用完成之后,我没有手动去清除,可能会导致内存泄漏,即线程回收,但是对应的ThreadLocal信息还存在,当请求增多,内存就会逐步泄漏。
于是手动在使用完毕的地方显式清除,同时在异常捕获的地方也加入了MEC.clear()。
除了这个问题,顺便指定了垃圾回收器为G1,而取代了JDK1.8默认的CMS。为了吞吐量的考虑。

阶段三:
加入了之后经过一个周末的观察,发现heap大小增加的现象依旧存在。其中还有个小插曲,阶段二中指定了G1,但是腾讯云的pod中执行java命令-XX:+PrintCommandLineFlags -version或者-XX:+PrintFlagsFinal,都显示使用的是ParallelGC,当使用arthas查看时,才显示的是G1。
eg:
使用java命令查看:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
使用artheas:
在这里插入图片描述

还是阿里开源的工具好用啊!

这次觉得内存泄漏问题可能没那么简单,于是将dump文件下载.
先执行jps命令,得到你的jvm的进程号:
在这里插入图片描述
接着执行命令:

jmap -dump:format=b,file=文件名.hprof <进程ID>

之后就能找到这个文件,当内存泄漏时,一般文件可能会过大,注意不要影响线上服务。生成之后可以下载下来,我这个压缩后将近800M。
压缩命令如下:

tar -zcvf filename.tar.gz filename

之后用内存分析工具打开,我用的是MAT,注意安装的时候要根据自己的jdk版本来找对应的MAT版本,例如我的是jdk1.8,下载的MAT版本是20180604-win32.win32.x86_64。还要注意如果hprof打不开,可能是你配置的程序内存大小太小了,MemoryAnalyzer.ini文件打开,-Xmx后边默认是1024M,改大一点就好了。
用内存分析工具打开dump文件,
在这里插入图片描述
Leak Suspects提示的是软件分析出来可能的泄漏猜测。
点击dominator_tree,
在这里插入图片描述
可以看到是异步线程池里边的线程占用了大量内存,进一步点开,发现是我引用的公司内其他组的打印日志jar包出现了问题,使用的vector容器有15W个变量存储,占用了所有的内存。
目前将异步线程这块的引用去掉,重新灰度了一个pod进行观测,对比看是否是这个原因引起的泄漏。
确实引用的打印日志的jar包有问题,异步线程的上下文没有被清除,通过内存分析,发现当前线程的信息中还有这个线程之前执行任务时候的日志,没有被清楚,说是给线程池加上一个装饰器就可以了,目前还在尝试这个解决办法

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

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

相关文章

HTML2.1列表标签

列表标签种类 无序列表 有序列表 自定义列表 使用场景&#xff1a;在列表中按照行展示关联性内容。 特点&#xff1a;按照行的形式&#xff0c;整齐显示内容。 一、无序列表 标签名说明ul无序列表整体&#xff0c;用于包裹li标签li表示无序列表的每一项&#xff0c;用于包…

【iOS】—— 消息传递和消息转发

消息传递和消息转发 文章目录消息传递和消息转发消息传递&#xff08;方法调用&#xff09;IMP指针IMP与SEL的区别与联系SEL是通过表取对应关系的IMP&#xff0c;进行方法的调用快速查找imp过程汇编代码查找过程总结消息发送快速查找imp(汇编):方法缓存慢速查找总结慢速查找消息…

全链路日志追踪

背景 最近线上的日志全局追踪 traceId 不好使了&#xff0c;不同请求经常出现重复的 traceId&#xff0c;或者通过某个请求的 traceId 追踪搜索&#xff0c;检索出了与该请求完全不相干的日志。我领导叫我去排查解决这个问题&#xff0c;这里我把我排查的过程思路以及如何解决…

真题详解(单元测试)-软件设计(五十)

真题详解(0/1背包)-软件设计&#xff08;四十九)https://blog.csdn.net/ke1ying/article/details/130163955 单元测试 五个特征&#xff1a;模块接口、局部数据结构、重要执行路径、出错处理、边界条件。 模块接口&#xff0c;保证测试模块数据流正确的流入和流出。 测试模块用…

大数据相关知识

1、大数据整体简介 1、1 简介 百度百科这样写道 大数据&#xff08;big data&#xff09;&#xff0c;IT行业术语&#xff0c;是指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合&#xff0c;是需要新处理模式才能具有更强的决策力、洞察发现力和流程优…

C++类的学习1

类的定义一般包括两部分&#xff0c;一是类的属性&#xff0c;二是他所拥有的方法。类的实例化是指给类的加载并初始化过程&#xff0c;比如一个people类&#xff0c;我们具体到每一个人就是类的实例化&#xff0c;此外一个类可以在此类上进行扩展。比如people类&#xff0c;我…

vue项目使用luckyexcel预览excel表格

场景 最近工作中在开发文档上传并能在新窗口打开预览的功能。在此记录下心路历程。 方法 我总共尝试了2种方法预览excel&#xff0c;均可实现。还发现一种方法可以实现&#xff0c;需要后端配合&#xff0c;叫做KKfileview。 1.使用luckyexcel插件实现xlsx的预览 2.使用fi…

组合式升降压PFC的分析方法

1. 组合式升降压PFC的基本原理 组合式升降压PFC采用两组储能元件&#xff0c;基本单元为Cuk&#xff0c;Sepic和Zeta。参考论文《New Efficient Bridgeless Cuk Rectifiers for PFC Applications》中的三种拓扑进行分析。   Cuk型PFC的TypeI如下图所示&#xff0c;正半周Dp一…

Jef-log-tail日志采集工具使用说明

介绍 jef-log-tail是一款基于netty实现的日志采集工具&#xff0c;支持指定目录、指定文件、指定后缀的动态持续日志采集&#xff0c;日常使用场景如&#xff1a;集群部署后将多台主机的日志集中存放到一台日志服务器上&#xff0c;或者将日志统一输出到数据库、redis、kafka、…

STM32实战项目-温湿度传感器

程序功能&#xff1a; 1、软件模拟I2C协议与SHT30数字温湿度传感器通讯&#xff1b; 2、数码管显示环境温湿度&#xff1b; 3、串口打印环境温湿度。 目录 一、硬件电路 二、技术讲解 2.1IIC简介 2.2 IIC总线协议 2.2设备接入 三、SHT30数字温湿度传感器 3.1性能介绍 …

Rollup 实践:插件生态和实用技巧(续)

在前面的文章中&#xff0c;我们已经了解了 Rollup 的性能优化和高级用法。本篇文章将继续探讨 Rollup 的插件生态和实用技巧。 插件生态 Rollup 拥有一个丰富的插件生态&#xff0c;下面我们介绍几个实用的插件&#xff1a; rollup-plugin-terser&#xff1a;使用 Terser 压…

FlowForge 使用教程 团队资源管理

前言 本篇文章结合FF的操作来给大家解释一下,FF在团队管理上都与那些资源可以操作。 团队创建 使用超管第一次登录FF平台,默认什么资源都没有,你只能先去创建一个团队才能继续往下操作。 在FF平台上,团队就代表一个租户,也是一种资源隔离的手段。 创建团队可以通过右上…

Rollup 实践:性能优化和高级用法(续)

在前面的文章中&#xff0c;我们已经了解了 Rollup 的基本概念和配置。本篇文章将继续探讨 Rollup 的性能优化和高级用法。 懒加载 通过 Rollup 的代码分割功能&#xff0c;我们可以实现懒加载&#xff0c;从而减小初始页面加载时间。假设我们有一个动态导入的模块 dynamic.j…

vue项目用后端返回的文件流实现docx和pdf文件预览

前端docx和pdf文件预览实现效果图docx-preview文件预览pdf文件预览写这篇文章的目的&#xff0c;是因为我比较懒&#xff0c;想把代码记录一下&#xff0c;方便日后使用&#xff1b;哈哈&#xff0c;如果你也需要&#xff0c;也可以复制粘贴啊&#xff0c;为了方便自己和需要的…

windows10开发环境下部署kafka消息服务

下载kafka&#xff0c;官方地址https://kafka.apache.org/downloads 百度网盘链接&#xff1a;https://pan.baidu.com/s/1h3iXtfzEIBoajGPId5Dcag?pwd0000 提取码&#xff1a;0000直接把下载的文件解压到某个盘的根目录&#xff0c;要不然后面的命令就会遇到“命令行过长”的报…

linux 系统的一些使用小技巧

实现RedHat非正常关机的自动磁盘修复 先登录到服务器&#xff0c;然后在/etc/sysconfig里增加一个文件autofsck,内容如下&#xff1a; AUTOFSCK_DEF_CHECKyes PROMPTyes 改变文件或目录之最后修改时间(变为当前时间) 执行格式&#xff1a;touch name ( name 可为文件或目录名称…

Matlab vs Python:哪个更适合数据分析和可视化?

当谈到数据分析和可视化时&#xff0c;许多人会思考使用哪种编程语言来实现这一目标。在IT行业&#xff0c;最流行的两种编程语言是Matlab和Python。这两种语言都有广泛的应用&#xff0c;但是对于初学者来说&#xff0c;选择哪种语言可能会有些困难。在本文中&#xff0c;我们…

【ENVI】监督分类

好久没用ENVI了&#xff0c;用起来有点生疏&#xff0c;这里记录一下操作流程。。。 基础数据&#xff1a;从91卫图下载相应地区影像数据。 下载影像推荐&#xff1a;地理空间数据云、91卫图、水经注等。 1、加载tif数据 2、样本选择 &#xff08;1&#xff09;在图层管理器…

Baumer工业相机堡盟工业相机如何通过BGAPISDK里的工具函数来计算工业相机的实时帧率(C#)

Baumer工业相机堡盟工业相机如何通过BGAPISDK里函数来计算相机的实时帧率&#xff08;C#&#xff09;Baumer工业相机Baumer工业相机的帧率的技术背景Baumer工业相机的帧率计算方式在BufferEvent声明显示FrameID设计显示帧率的函数Baumer工业相机通过BGAPI SDK计算帧率的优势​B…

亚马逊云科技:智能家居时代已来,如何抢滩海外市场的“真空区”?

在充满着不确定性的2022年&#xff0c;电子消费市场一片哀鸿遍野&#xff0c;智能家居行业却如同逆水行舟&#xff0c;显示出稳健的发展之势&#xff0c;宣告着智能家居时代已来。在2023年3月24日举办的“智能家居&#xff0c;出海闭门会”上&#xff0c;为进一步发挥产业带潜力…