真实项目中,由于内存泄漏(OOM),导致1W多次full gc,最终项目宕机

一、背景

由于要做http全链路调用追踪,我们团队修改了httpclient底层代码,加了http调用日志,并且和我们配置中心打通,可以通过配置中心动态的控制日志输出,正是由于加了这个动态开关,导致的内存泄漏。
下面我们看下具体的排查过程:

二、正文

1、首先看下dump文件,我是用的JProfiler打开dump文件。
在这里插入图片描述

这是按照“保留大小”降序排序的。
“保留大小”不明白的,可以看下这篇文章:https://www.jianshu.com/p/aaddf00a1d83
我们可以看到,第三个RedirectExec这个类,实例数有100多万个,保留大小由5个G,基本可以确定问题就出在这里了。
2、然后我们选定第三条,右键选择“使用选定对象”,如下图:
在这里插入图片描述
在这里插入图片描述

“引用”这选择“传入引用(incoming references)”。
解释下:incoming references和outgoing references
outgoing references :这个对象引用了哪些对象
incoming references :哪些对象引用了这个对象
在这里插入图片描述
如上图所示:可以看到configChangeListener这个类引起的oom,这个类的作用是我们自己的配置中心的监听器,监听zk节点变化,动态更新配置文件用的类。

问题分析:
由于修改了httpClient底层的代码,在RedirectExec这个类的构造函数中,引入了监听器。feigen和单实例的httpClient这两种情况,这个监听器只会初始化一次。但要是每次http请求都new httpClient,这种多实例的就会发生问题,会new很多监听器,这个httpclient就由于有监听器这个引用,所以就不会被GC回收,最后就会进入老年代,不断进行full gc,full gc会导致程序变慢,并且这些监听器不会被释放,就会一直在内存中,最后把内存打满,发生oom。

三、总结

写代码的时候,要认真考虑和测试各种情况,上面就是没有考虑到多实例的httpclient这种情况,导致发生oom。平常要多去思考,谨慎对待每一次的版本发布。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

华为OD机试真题-最长子字符串的长度(一)-2023年OD统一考试(C卷)---Python3--开源

题目: 考察内容: 思路转化:求出o字母出现偶次(o的索引);环形–双倍字母; 方法1:循环变量双倍字母(保证环线),记录最大偶次,如果是&a…

MySQL之Pt-kill工具

工具下载 [rootlocalhost1 bin]# wget percona.com/get/percona-toolkit.tar.gz [rootlocalhost1 bin]# yum install perl-DBI [rootlocalhost1 bin]# yum install perl-DBD-MySQL [rootlocalhost1 bin]# ./pt-kill --help1、每10秒检查一次,发现有 Query 的进程就…

如何在有限的预算里做好服务器的DDOS防护?

在网络安全领域,防御分布式拒绝服务(DDoS)攻击是一项持续且复杂的挑战。尤其对于预算有限的组织来说,如何在不牺牲安全性的前提下进行有效的防护,更是一个需要深思熟虑的问题。以下是一些建议,帮助你在有限…

QT C++实现点击按键弹出窗口并显示图片/视频|多窗口应用程序的设计和开发

一、介绍 首先,QT界面开发中主要大体分为2种多窗口的形式: 嵌入式: 新生成的窗口嵌入在主窗口内部独立窗口: 以弹窗形式的新窗口生成和展示 这里就讲解最简单的:点击案件后,跳出一个新窗口 二、代码实…

%00截断 [GKCTF 2020]cve版签到

打开题目 F12之后在Headers中发现hint 两者结合利用零字符截断使get_headers()请求到本地127.0.0. 结合链接 构造 ?urlhttp://127.0.0.1%00www.ctfhub.com 必须以123结尾 ?urlhttp://127.0.0.123%00www.ctfhub.com 得到flag 知识点: PHP中get_headers函数 g…

python爬虫实战:获取电子邮件和联系人信息

引言 在数字时代,电子邮件和联系人信息成为了许多企业和个人重要的资源,在本文中,我们将探讨如何使用Python爬虫从网页中提取电子邮件和联系人信息,并附上示例代码。 目录 引言 二、准备工作 你可以使用以下命令来安装这些库&a…

【pytorch】常用代码

文章目录 条件与概率torch.tensor()torch.rand()torch.randn()torch.randint()torch.multinominal() 逻辑运算torch.argmax()torch.max()torch.sum()torch.tanh()torch.pow() 功能性操作 torch.nn.functionalF.normalize()F.elu()F.relu()F.softmax() 张量计算torch.zeros()tor…

OpenHarmony分布式购物车案例展示~

简介 分布式购物车demo 模拟的是我们购物时参加满减活动,进行拼单的场景;实现两人拼单时,其他一人添加商品到购物车,另外一人购物车列表能同步更新,且在购物车列表页面结算时,某一人结算对方也能实时知道结…

苹果设备再现完美兼容32位软件 只需一款神奇工具 CrossOver 24发布:基于 Wine 9.0,能让 Mac 初步运行 32位应用

近日,CodeWeavers发布了CrossOver 24版本的更新。这次的更新是基于最新的Wine 9.0版本而进行的。这一版本的更新不仅能够兼容更多应用程序和游戏,而且还可以初步支持运行32位的应用程序。 自从苹果在macOS Catalina系统中移除对32位软件的支持之后&…

【Git】Git命令的学习与总结

本文实践于 Learn Git Branching 这个有趣的 Git 学习网站。在该网站,可以使用 show command 命令展示所有可用命令。你也可以直接访问网站的sandbox,自由发挥。 一、本地篇 基础篇 git commit git commit将暂存区(staging area&#xff…

Outlook邮箱配置步骤?如何配置电子邮箱?

Outlook邮箱配置的方法?Outlook邮箱配置SMTP的方法? Outlook邮箱配置不仅能够帮助我们高效地管理邮件,还可以提供日程安排、联系人管理等多项功能。那么,如何配置Outlook邮箱呢?接下来,蜂邮EDM将为大家详细…

mac安装zookeeper

下载地址: http://archive.apache.org/dist/zookeeper/ 注意:由于Zookeeper从3.5.5版本开始,带有bin名称的包才是我们想要的下载可以直接使用的里面有编译后的二进制的包,而之前的普通的tar.gz的包里面是只是源码的包无法直接使…

HUAWEI Programming Contest 2024(AtCoder Beginner Contest 342)

D - Square Pair 题目大意 给一长为的数组,问有多少对,两者相乘为非负整数完全平方数 解题思路 一个数除以其能整除的最大的完全平方数,看前面有多少个与其余数相同的数,两者乘积满足条件(已经是完全平方数的部分无…

微信小程序蓝牙通信HC08

总结这两天研究的蓝牙串口。人话版资料不多,主要靠翻别人的仓库和文档。 单片机部分,与蓝牙串口通信是通过串口。比我想的要简单,小程序部分,有非常多的服务和特征,而且人话版资料不多。 如果本文有什么问题&#xf…

AI之T2I:Stable Diffusion 3的简介、安装和使用方法、案例应用之详细攻略

AI之T2I:Stable Diffusion 3的简介、安装和使用方法、案例应用之详细攻略 目录 Stable Diffusion 3的简介 1、效果测试 官方demo 网友提供 Stable Diffusion 3的安装和使用方法 1、安装 2、使用方法 Stable Diffusion 3的案例应用 1、基础案例 Stable Diff…

RestTemplate启动问题解决

⭐ 作者简介:码上言 ⭐ 代表教程:Spring Boot vue-element 开发个人博客项目实战教程 ⭐专栏内容:个人博客系统 ⭐我的文档网站:http://xyhwh-nav.cn/ RestTemplate启动问题解决 问题:在SpringCloud架构项目中配…

Vue实现登录保存token并校验实现保存登录状态

文章目录 一、登录vue二、路由index 一、登录vue <script> import request from "/axios/baseURL"; import router from "/router";// 接口数据初始化 const FORM_DATA {userName: "",password: "", }; export default {data(…

腾讯文档(excel也一样)设置单元格的自动行高列宽

1. 选中单元格 可选择任意一个或者几个 2. 设置自动 行高和列宽 即可生效

掌握微信小程序开发的核心要点:从基础到进阶

文章目录 掌握微信小程序开发的核心要点&#xff1a;从基础到进阶一、数据绑定和事件处理1.1 理解小程序的数据绑定机制&#xff0c;实现数据和视图的同步更新1.2 学习如何处理用户交互事件和触发相应的响应逻辑 二、网络请求和数据交互2.1 使用小程序的网络请求API与后端服务器…

unity发布webGL压缩方式的gzip,使用nginx作为web服务器时的配置文件

unity发布webGL压缩方式的gzip&#xff0c;使用nginx作为web服务器时的配置文件 Unity版本是&#xff1a;2021.3 nginx的版本是&#xff1a;nginx-1.25.4 Unity发布webgl时的测试 设置压缩方式是gzip nginx配置文件 worker_processes 1;events {worker_connections 102…