当前位置: 首页 > news >正文

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

阶段一:
前段时间,突然发现服务在毫无征兆的情况下发生了重启。去看了一下容器退出的日志,发现内存利用率超过了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包有问题,异步线程的上下文没有被清除,通过内存分析,发现当前线程的信息中还有这个线程之前执行任务时候的日志,没有被清楚,说是给线程池加上一个装饰器就可以了,目前还在尝试这个解决办法

相关文章:

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

阶段一&#xff1a; 前段时间&#xff0c;突然发现服务在毫无征兆的情况下发生了重启。去看了一下容器退出的日志&#xff0c;发现内存利用率超过了100%&#xff0c;导致容器重启&#xff0c;进一步看了skyWalking&#xff0c;发现heap内存超了&#xff0c;当时只是简单的以为是…...

QML控件--Drawer

文章目录一、控件基本信息二、控件使用三、属性成员一、控件基本信息 Import Statement&#xff1a;import QtQuick.Controls 2.14 Since&#xff1a;Qt 5.7 Inherits&#xff1a;Popup 二、控件使用 Drawer&#xff1a;提供一个可以使用滑动手势打开和关闭的侧面板&#xff…...

PHY- PHY芯片概述

1 PHY概述 关于Internet Protocal的分层模型可以参考文章 :【Internet Protocal-OSI模型中的网络分层模型】,下面我们讲讲底层以太网控制器和收发器的知识。其主要是处理OSI模型中的物理层和链路层的事情。 在CAN/CANFD、FlexRay等总线中,有控制器Controller和收发器Transc…...

【C++】如何获取当前正在运行的函数的名称?

func、FUNCTION、__PRETTY_FUNCTION__的区别 常用获取函数名成的方法都有__func__、FUNCTION、PRETTY_FUNCTION。那么它们的区别是什么呢&#xff1f;   1) func、FUNCTION&#xff1a; 主要是获取函数的名称。   2) PRETTY_FUNCTION&#xff1a; 不仅能获取函数的名称&am…...

42.原型对象 prototype

目录 1 面向对象与面向过程 2 原型对象 prototype 3 在内置对象中添加方法 4 constructor 属性 5 实例对象原型 __proto__ 6 原型继承 7 原型链与instanceof 7.1 原型链 7.2 instanceof 8 案例-模态框 1 面向对象与面向过程 编程思想有 面向过程 与 面向…...

python 读写txt方法

​​​​​​​ 1. Python支持在程序中读写 txt文件。这里有两种方式&#xff1a; 方式一&#xff1a;使用 python内置函数&#xff0c;该函数将一个字符串的长度转换为与这个字符串长度相关的值。 例如&#xff1a;" readme"&#xff08;"r&#xff09;。 prin…...

香橙派pi5下,debian,docker19.03.9版本runc容器逃逸

在香橙派pi5下,debian,docker19.03.9版本下,安装系统后,启动docker,显示一切正常。 当加入k8s集群以后,可以正常连接到集群,node状态显示为ready。看起来一切正常。不过过一会之后,香橙派节点内存飙升,然后挂掉。重连失败,需要重启后才能重连。且swapoff -a命令执行…...

Thinkphp6.0中间件.上

本节课我们来学习一下中间件的用法&#xff0c;定义一下中间件。 一&#xff0e;定义中间件 1. 中间件的主要用于拦截和过滤 HTTP 请求&#xff0c;并进行相应处理&#xff1b; 2. 这些请求的功能可以是 URL 重定向、权限验证等等&#xff1b; 3. 为了进一步了解中间件的用法&…...

十进制到八进制的转换

目录 十进制到八进制的转换 程序设计 程序分析 十进制到八进制的转换 【问题描述】对于输入的任意一个非负十进制整数n(0=<n<100000),打印输出与其等值的八进制数 【输入形式】非负十进制整数 【输出形式】相应十进制整数转换后的八进制正整数,若输入不符合要求,…...

【从零开始学Skynet】基础篇(四):网络模块常用API

游戏服务端要处理客户端请求&#xff0c;作为服务端引擎&#xff0c;网络编程也是Skynet的核心功能。1、学习网络模块 skynet.socket模块提供了网络编程的API&#xff0c;常用的API如下表所示&#xff1a;Lua API说明socket.listen(address ,port)监听一个端口&#xff0c;返回…...

怎么免费制作logo?logo免费设计在线生成,从此设计不求人

你有没有因为Logo制作而烦恼过&#xff1f;对于很多人来说&#xff0c;logo制作是一项比较大的工程&#xff0c;需要专门的设计师才能完成。但是请人设计费用高还很费时间&#xff0c;还需多次沟通修改。其实&#xff0c;我们可以自己免费制作logo&#xff0c;下面&#xff0c;…...

【目标检测】目标检测遇上知识图谱:Object detection meets knowledge graphs论文解读与复现

前言 常规的目标检测往往是根据图像的特征来捕捉出目标信息&#xff0c;那么是否有办法加入一些先验信息来提升目标检测的精准度&#xff1f; 一种可行的思路是在目标检测的输出加入目标之间的关联信息&#xff0c;从而对目标进行干涉。 2017年8月&#xff0c;新加波管理大学…...

IDEA重复下载SNAPSHOT包问题

问题现象 reimport 之后 状态栏显示resolving dependencies… 遇到某个比较大的快照包(33M)&#xff0c;同一天的第2个版本时 1.0-xxx-SNAPSHOT.时间戳-2 idea importer 会先分片下载 x.jar.part文件中&#xff0c;然后复制为x.jar吧 如图中所示&#xff0c;其实已经下载完了&…...

【Unity入门】12.MonoBehaviour事件函数

【Unity入门】MonoBehaviour事件函数 大家好&#xff0c;我是Lampard~~ 欢迎来到Unity入门系列博客&#xff0c;所学知识来自B站阿发老师~感谢 &#xff08;一&#xff09;常用的事件函数 &#xff08;1&#xff09;start和update方法 之前我们写的脚本&#xff0c;会默认帮助…...

1.3 Docker Compose-详细介绍

Docker Compose是一个用于定义和运行多个Docker容器的工具。它可以让用户轻松地定义和管理多个容器的配置&#xff0c;并且可以通过简单的命令来启动、停止和重启这些容器。在本文中&#xff0c;我们将详细介绍Docker Compose的使用和功能。 一、Docker Compose的安装 Docker…...

数据分析:麦当劳食品营养数据探索并可视化

系列文章目录 作者&#xff1a;i阿极 作者简介&#xff1a;Python领域新星作者、多项比赛获奖者&#xff1a;博主个人首页 &#x1f60a;&#x1f60a;&#x1f60a;如果觉得文章不错或能帮助到你学习&#xff0c;可以点赞&#x1f44d;收藏&#x1f4c1;评论&#x1f4d2;关注…...

ES6标准

ECMAScript 6.0&#xff08;以下简称 ES6&#xff09;是 JavaScript 语言的下一代标准 前端es6是模块化开发&#xff1b;es6模块化规范就是浏览器端与服务器端通用的模块化开发规范&#xff0c;其中定义了每一个JavaScript文件都是一个独立的模块&#xff0c;导入其他模块成员…...

ASP一个物流商品运输系统的设计与实现

物流运输行业的今天正朝着追求高效、低成本、稳定可靠的方向发展。本文详细介绍了网上物流管理系统&#xff0c;涉及到客户端运输线路设计、过程跟踪等功能模块以及管理员端的相应模块的具体实现&#xff0c;分析了整个系统的架构、工作原理、实现功能等。系统采用ASPMS SQL以B…...

肖 sir_就业课__009ui自动化讲解

ui自动化讲解 1、你做过自动化测试吗&#xff1f;做过 ui自动化测试、接口自动化、app自动化 2、你讲下你做的ui接口自动化&#xff1f; &#xff08;1&#xff09;第一种&#xff1a;按照线性流程讲解 &#xff1a;pythonselenium 库做ui自动化 &#xff08;2&#xff09;第二…...

「线性DP」花店橱窗

花店橱窗 https://ac.nowcoder.com/acm/contest/24213/1005 题目描述 ​ 小q和他的老婆小z最近开了一家花店&#xff0c;他们准备把店里最好看的花都摆在橱窗里。 ​ 但是他们有很多花瓶&#xff0c;每个花瓶都具有各自的特点&#xff0c;因此&#xff0c;当各个花瓶中放入不同…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中&#xff0c;我们已经大致实现了rpc服务端的各项功能代…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

【JavaEE】-- HTTP

1. HTTP是什么&#xff1f; HTTP&#xff08;全称为"超文本传输协议"&#xff09;是一种应用非常广泛的应用层协议&#xff0c;HTTP是基于TCP协议的一种应用层协议。 应用层协议&#xff1a;是计算机网络协议栈中最高层的协议&#xff0c;它定义了运行在不同主机上…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet&#xff0c;点击确认后如下提示 最终上报fail 解决方法 内核升级导致&#xff0c;需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版​分享

平时用 iPhone 的时候&#xff0c;难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵&#xff0c;或者买了二手 iPhone 却被原来的 iCloud 账号锁住&#xff0c;这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log&#xff0c;共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题&#xff0c;不能使用ELK只能使用…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...