我能读懂泄露报告,却读不懂女人心,一文带你实战内存溢出排查

自制JS某课脚本 根据实际需求自制网页讯网刷题脚本,绕过人脸,弹窗,答题,实现自动化运行 阅读详情

喜迎周二

让我们在一个舒缓的 BGM 中开始今日话题 内存溢出

前情提要

很多伙伴,在碰到内存溢出,根本无从先下手,甚至重启已经成为解决问题的常态,面试追问场景,也只是熟练背诵八股文而已,那么这篇文章,带你详细从问题的发生到排查做一个讲解。

忽略如何发现的 OOM,以及与运维等角色协同,直接进入问题解决,来日方长,慢慢介绍。

主人公

  • 小李-某司技术一把手,年纪轻轻,财务自由,开小米 SU7
  • 小白手套-某司技术 家财万贯,只为体验生活,上级小李,开法拉利

问题出现

某天小李手机突然疯狂开始震动,监控系统告警,某服务疯狂 OOM,如果不快速处理,可能也会拖累到服务器本身, 小李心想,这些问题,我也一知半解的,那谁谁,小白手套,这次就你来吧,不懂可以问我。

小白手套OS:真倒霉,行吧 ,我来看。

小白手套不情愿的登录到了公司服务器,查看日志,果然,OOM 错误 吞没了屏幕

小白手套很快注意到了 Java heap space ,按照常理来讲,一般是堆内存被分配光了,可是生产环境,一般分配都是经过严谨评估的,嗯,对了,记得生产有配置如果发生 OOM 自动 Dump 堆内存的,我去找找这个文件,问题就会水落石出。

拿到堆文件

很快,小白手套找到了堆转储文件

神器 MAT

MAT(Memory Analyzer Tool)是一个用于分析Java堆内存使用情况和排查内存泄漏问题的强大工具。它是一个开源项目,由Eclipse基金会维护和支持。

MAT提供了一系列功能,可以帮助你识别和解决Java应用程序中的内存问题。它可以分析Java堆转储文件(通常是通过Java虚拟机的"-XX:+HeapDumpOnOutOfMemoryError"参数生成的)或运行时快照,并提供以下功能:

  1. 内存泄漏分析:MAT可以检测和分析内存泄漏,找出那些没有被正确释放的对象,从而导致内存占用过高的问题。
  2. 重复对象分析:MAT可以识别并分析堆内存中的重复对象,帮助你找出可能存在的冗余对象,并进行优化。
  3. 堆转储分析:MAT可以解析和分析Java堆转储文件,提供关于对象实例、类信息、引用关系和内存使用情况的详细信息。
  4. 内存使用统计:MAT提供了各种内存使用的统计信息,包括对象实例数量、内存占用大小、类加载器信息等,以帮助你了解应用程序的内存使用情况。
  5. 内存泄漏报告:MAT可以生成详细的内存泄漏报告,包括泄漏对象的路径、引用链和相关的堆转储信息,帮助你定位和解决内存泄漏问题。

下载地址:https://eclipse.dev/mat/downloads.php

小白手套熟练的将 Dump 文件下载到本地,并导入 MAT

内存泄露报告

翻译如下

OK,选择 Finish 后,就出现了一张简单的饼图

一眼可以看到,a 区域的内存占用达到 95 %,基本上可以定位到,问题是在这里开始的

Histogram

这时,我们通过第一个利器,Histogram 来通过柱状图,展示每个类的实例数

介绍一下每一列的含义

  • ClassName 类名
  • Objects 对象数
  • Shallow Heap(浅堆层) 对象实际占用堆的大小
  • Retained Heap (保留堆)可以理解为,如果这个对象被删除,可以省出多少内存

按照分析图来看,java.lang.Object[] 最大,接下来,排除掉 Object[] 的软引用,看它的强引用

可以看到 tomcat 某个线程创建了 Object[] 数组,Ref. Shallow Heap(引用的浅堆大小): 420,781,224个,并且给数组重复填充了值 HeapOverflowExample ,

换句话来说,就是一个线程引用了大量的数组对象,占用了极大的内存,从而导致堆溢出,所以根据属性可以定位到程序的确是有不恰当的地方

Domain Tree

Domain Tree 和 Histogram 类似,是通过对象栈的方式进行展示

结语

遇到 OOM 问题不要慌,先及时恢复应用,将案发现场做好保存,事后分析即可,由于业务复杂性,可能查询方式不像这样容易,通过泄露报告定位大对象 + 强引用的思路,不会出错。

名词解释:

  • 内存溢出:指程序在申请内存时,没有足够的内存空间,导致出现 OutOfMemoryError
  • 内存泄露:指程序在申请内存后,无法释放申请的内存空间,时间一久从而出现 OutOfMemoryError

思考

  1. 如果你电脑只有 2G 内存,线上 Dump 文件有 20G,要怎么办呢?
  2. 除了 MAT 还有什么工具可以分析?

祝你好运!

AI问数,智慧赋能:基于大语言模型的数据播报员应用实践探索 AI问数技术正在改变企业与数据交互的方式,它以自然语言为桥梁,让数据不再是少数专家的专利,而是成为所有业务人员的决策伙伴。这不仅是技术的创新,更是管理理念的革新。在数字化转型的关键阶段,企业应积极拥抱AI问数技术,通过降低数据使用门槛、提升数据利用效率、释放数据潜在价值,实现真正的数据驱动决策,为企业的高质量发展注入源源不断的智慧动能。AI问数,正在开启一个数据普惠的新时代。 阅读详情

相关推荐

ESP32-S3 SPI接口实战:从引脚分配到高速通信配置

本文详细解析了ESP32-S3的SPI接口配置与高速通信优化技巧,从引脚分配到软件配置,再到DMA传输和时钟优化,帮助开发者快速掌握SPI通信技术。特别针对ESP32-S3的SPI2接口进行了实战演示,包括硬件连接和常见问题排查,适用于各类嵌入式开发项目。

weixin_29189373的博客 677

Day33 XD安全学习笔记--JavaEE应用&SQL 预编译&Filter过滤器&Listener监听器&访问控制

本文介绍了SQL预编译与Filter过滤器、Listener监听器的应用。SQL预编译有效防止注入攻击,相比拼接写法更安全。Filter用于拦截请求与响应,实现权限控制、敏感词过滤等功能,具备初始化、过滤、销毁生命周期;如XssFilter拦截非法参数,AdminFilter通过Cookie验证权限。Listener监听域对象的创建、销毁及属性变化,如Session的创建与销毁,实现系统状态管理。三者协同提升Web应用的安全性与可维护性。

一支蜉蝣的博客 226

网络抓包实战:如何捕获与解析802.1Q VLAN标签报文

在网络通信中,数据包是信息传输的基本单元,而VLAN(虚拟局域网)技术通过在数据链路层插入802.1Q标签,实现了网络流量的逻辑隔离与高效管理。其核心原理是在标准以太网帧头中嵌入4字节的VLAN标识,使交换机能够根据VID(VLAN ID)进行精准转发。掌握VLAN报文的捕获与解析技术,对于网络故障排查、安全审计和性能优化具有重要价值,尤其在需要验证网络隔离策略或诊断Trunk链路异常时。本文聚焦于使用Wireshark工具,结合端口镜像等实操方法,详细演示如何抓取并解读携带802.1Q标签的原始报文,帮助

weixin_33417488的博客 382

【JavaEE进阶】SpringBoot

打开idea,help,about,看版本号版本课件要求社区版需要安装插件,插件对版本有要求专业版不需要删除注册表软件破解。

哦虎!的博客 256

Scissor算法实战:利用bulkRNA表型数据精准定位单细胞亚群

本文详细介绍了Scissor算法的实战应用,该算法通过整合bulkRNA-seq的丰富表型信息与单细胞数据,精准识别与特定临床结局(如不良预后)相关的单细胞亚群。文章深入解析了算法三步走的核心思想,并提供了适配Seurat v5的完整代码解决方案,帮助研究者从海量数据中提炼具有生物学和临床价值的洞见。

ww90123的博客 254

MPC模型预测控制实战:从理论到代码实现(Python示例)

本文详细介绍了MPC模型预测控制的实战应用,从理论到Python代码实现。通过构建系统模型、预测方程、优化问题及约束处理,展示了如何实现一个完整的MPC控制器。文章还提供了水箱液位控制的应用案例,帮助读者掌握MPC在工业控制中的实际应用。

weixin_42653691的博客 459

Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)

Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)

要努力去发光,而不是被照亮~ 125

DisplayPort 1.4扰码原理与16位并行LFSR实现

DisplayPort物理层信号完整性依赖于数据扰码技术,其本质是通过线性反馈移位寄存器(LFSR)对传输数据进行伪随机化处理,以改善频谱分布、抑制低频能量堆积、提升时钟恢复能力并降低EMI辐射。该技术广泛应用于高速串行接口如DP、PCIe和USB,核心在于确定性伪随机序列生成与收发端同步。DisplayPort 1.4强制要求符合ANSI X3.230标准的16级LFSR,并在8b/10b编码后执行扰码;而传统串行实现难以满足21.6Gbps速率下的时序约束,必须采用并行展开结构——将16拍移位压缩为单周

weixin_29192211的博客 313

Java EE 进阶:8.MyBatis 操作数据库(入门)(第三弹)

Java EE 进阶:8.MyBatis 操作数据库(入门)(第三弹)

要努力去发光,而不是被照亮~ 347

4.4 直流无刷电机(BLDC):控制器硬件设计

摘要 本文详细阐述了直流无刷电机(BLDC)控制器的硬件设计要点。控制器硬件主要包括微处理器单元、功率驱动模块、信号检测电路、通信接口和电源管理模块。在微处理器选型方面,分析了ARM Cortex-M系列、DSP等架构的适用场景,并对比了不同处理器的性能参数。功率驱动模块设计重点包括栅极驱动电路、逆变桥热管理和电流保护机制。信号检测部分介绍了位置传感器接口和模拟信号调理技术。此外,还讨论了通信接口设计、电源管理方案以及硬件布局与EMC设计规范。最后强调了硬件测试验证的重要性,包括故障注入测试等验证方法。整体

技术工作者 183

图像修复的万能模型:用Instruct-IPT统一解决去雨、去雾、去模糊三大难题

从原理到实战,你已经掌握了Instruct-IPT的核心逻辑和使用方法。它不仅能一站式解决多种图像退化问题,还能通过文本指令灵活控制,是图像恢复领域的“多面手”。现在,不妨找几张有雨雪、雾霾、模糊问题的图像,用Instruct-IPT亲手试试效果。当你看到模糊的图像变得清晰,被雨雾遮挡的细节重新浮现时,你会真切感受到这项技术的魅力。后续还可以尝试调整文本指令的描述方式,看看模型的响应有什么变化——探索的过程,就是你技术进阶的最好见证。

m0_71589036的博客 226

java ee--多线程(初阶·上)

本文为Java多线程入门指南,涵盖线程概念、Thread方法、线程状态、线程安全及synchronized关键字。通过银行办事业务类比,阐明线程是独立执行流,可并发提升效率;对比进程与线程差异,强调线程共享内存、调度轻量;介绍创建线程的两种方式(继承Thread或实现Runnable),推荐后者以实现解耦;重点讲解多线程带来的线程安全问题及用synchronized解决共享资源竞争,确保代码正确性。

2601_97033068的博客 533

黑猫带你学eMMC协议第14篇:eMMC FFU详解(Field Firmware Update)

1 前言 1.1 声明 本文依据eMMC JEDEC5.1及个人工作经验整理而成,如有错误请留言。 本文结合eMMC JEDEC5.1协议手册查看效果更佳。 1.2 内容提要 1、ffu相关寄存器有哪些? 2、如何设置ffu? 3、什么是ffu?是否能够更新旧版本的固件到emmc? 4、ffu配置流程图。 2 什么是FFU 主机下载新的固件到eMMC,下载成功后eMMC将固件安装到设备。 3 相关寄存器/命令 SUPPORTED_MODES [493] FFU_FEATURES [492] 该

黑猫奥利奥的博客 4658

【JavaEE进阶】配置文件

配置文件是把可能出现的情况写进去,需要的时候直接调用,解决了硬编码带来的问题我们配置文件是application。

哦虎!的博客 166

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

java ee--多线程(初阶·下)

本文系统讲解Java多线程核心概念:volatile保证内存可见性但不保证原子性,适用于状态标志;wait与notify实现线程间协作,需在同步块中调用,基于对象监视器通信;通过单例、阻塞队列、定时器、线程池等案例展示实际应用;总结线程安全的三大思路(互斥、无共享、原子操作);最后对比线程与进程,明确其资源隔离与调度差异。内容详实,适合初学者深入理解并发编程。

2601_97033068的博客 463

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Java EE 进阶:8.MyBatis 操作数据库(入门)(第二弹)

Java EE 进阶:8.MyBatis 操作数据库(入门)(第二弹)

要努力去发光,而不是被照亮~ 376

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

javaEE(7)HTTP与HTTPS

HTTP是应用层协议,基于TCP(或UDP)传输,通过请求/响应报文交互。其核心包括URL定位资源、GET/POST等方法、状态码反馈结果及无状态特性。为解决明文传输的安全问题,引入HTTPS,采用混合加密与CA数字证书机制,实现身份认证、防窃听与篡改。尽管HTTPS增加握手开销,但保障了通信安全,是现代Web的必备标准。

2502_93175209的博客 2495

Java EE 进阶:6.SpringBoot 配置文件(第二弹)

Java EE 进阶:6.SpringBoot 配置文件(第二弹)

要努力去发光,而不是被照亮~ 460

java ee--计算机是如何工作的

在这阶段的课程里,我们会从软件工程师的视角来解释计算机是如何工作的。我们的主要目标不是要求大家亲手造出一台计算机;也不是介绍如何编写程序;而是希望大家在了解计算机核心工作机制之后,打破对计算机的神秘感,并且能理解我们平时编程时一些行为、动作背后的历史渊源。建议大家配合(计算机科学速成课)这套视频做更详尽的学习和了解,文字讲义与视频互为补充,效果最好。很多人写了几年代码,仍然把计算机当成一个"输入程序就吐出结果"的黑箱。

2601_97033068的博客 628

【JavaEE进阶】JVM(面试)

jvm就是JAVA虚拟机,这个和我们软件虚拟机vmware不一样,他只是针对JAVA程序,针对字节码进行解释执行像python JavaScript都是需要虚拟机的编程语言,为的是更好支持不同操作系统和CPUjdk是JAVA开发工具包jre是JAVA运行环境jvm是JAVA虚拟机它们一层包一层开发JAVA代码,安装jdk就包含了jre不需要开发就只运行了一个JAVA程序,只安装jre即可jvm很多底层东西,和我们关系不大,主要是高频面试题。

哦虎!的博客 181

Java EE 进阶:7.Spring Boot 日志(第一弹)

Java EE 进阶:7.Spring Boot 日志(第一弹)

要努力去发光,而不是被照亮~ 221

JavaEE(7)JVM

本文系统介绍JVM核心机制:基于HotSpot(JDK8)阐述其执行流程、运行时数据区(堆、方法区、栈等)、类加载双亲委派模型及破坏场景;重点解析垃圾回收原理,包括可达性分析、四种引用、三大算法与分代收集思想,并对比常见收集器特性,涵盖Minor/Full GC差异与并发并行策略,为性能调优与内存问题排查提供理论基础。

2502_93175209的博客 329

【JavaEE进阶】SpringIoC&DI

spring,springMVC,SpringBoot不是互斥的boot是框架,引入了第三方和很多依赖,像12306,MVC是这其中一个功能spring量大核心思想,ioc,aopspring是包含了众多工具方法的IoC容器IOC是控制反转,对象控制权,正常谁用谁控制也就是new一个,现在同一交给spring使用lombok和web勾上di,依赖注入容器在运⾏期间, 动态的为应⽤程序提供运⾏时所依赖的资源,称之为依赖注⼊。

哦虎!的博客 207

Java EE 进阶:7.Spring Boot 日志(第二弹)

Java EE 进阶:7.Spring Boot 日志(第二弹)

要努力去发光,而不是被照亮~ 400

Day32 XD安全学习笔记--JavaEE应用&Servlet路由技术JDBC&Mybatis数据库&生命周期

本文介绍了Java Web开发中Servlet的传参、路由配置、数据库连接及预编译应用。通过web.xml或@WebServlet注解实现路由映射,使用doGet和doPost方法处理GET/POST请求,获取参数并响应。结合Maven构建项目,完成依赖下载与打包。数据库操作采用JDBC连接,重点使用预编译语句防止SQL注入,提升安全性与性能。

一支蜉蝣的博客 41

java ee--线程的六种状态

Java线程有六种状态:NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED。状态流转以RUNNABLE为中心,通过start()进入,通过锁竞争、等待或结束退出。关键区别在于:sleep不释放锁而wait会释放;BLOCKED仅由synchronized引起;RUNNABLE包含就绪与运行。理解状态切换有助于排查线程阻塞问题。

2601_97033068的博客 461
上一篇: 神器 Portainer,小白手套的春天
下一篇: 小白手套的 Docker 奇幻旅行之探秘 Namespace
「已注销」
博客等级 码龄3年 236粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

「已注销」

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值