线上java内存泄露处理实录

JVM内存Dump原理与在线分析实战 | 得物技术 当前我们微服务容器化部署JVM 实例很多,常常需要进行JVM heap dump analysis,为了提升JVM 问题排查效率,得物技术保障团队研究了JVM内存Dump 原理与设计开发了JVM 内存在线分析。 常见的JVM heap dump analysis 工具如: MAT,JProfile,最常用的功能是大对象分析。功能上本地分析工具更全面,在微服务架构下,成千上万的实例当需要一次分析的时候,于是我们思考如何提供更方便更快的在线分析方便研发人员快速排障。... 阅读详情

线上现象(各种监控数据)

1.公司项目在监控平台上开始报警(jvm堆内存占用报警,FullGC次数超频率报警)

2.观察具体的监控图标(预发机器) 线程数平稳(260左右)

  1. 方法监控可以看到在fullGC比较频繁时,业务方法几乎无响应

线上配置(jvm配置,运行时内存分布)

  1. 项目版本:jdk8 ,spring 5, 默认垃圾处理器 Parallel GC with 43 thread(s) -Xms800m -Xmx800m -XX:MaxPermSize=256m

  1. 运行时jstat

  2. 运行时jmap histo

  1. heap

5.dump文件1G左右,不发了,稍后看一下MAT分析的图表吧

逻辑分析(定位问题大致方向)
  1. 通过监控和运行时数据分析,堆内存(年轻代和老年代)、非堆(方法区)、均打满配置内存
  2. 即使FullGC,堆内存和非堆也只能回收少许内存,并且整体水位倾斜向上,直到内存溢出

通过逻辑分析,内存溢出问题来自于存在泄漏,接下来分析dump文件

内存分析(定位问题确切泄漏源)

采用MAT工具载入dump文件进行leak分析

通过分析可以看出红色的业务方法保留引用太多, 找到泄漏源了,接下来就分析业务代码具体的问题

通过分析,我们最终定位了这段代码,我们改造过程中引入了一个开源的属性运行时拷贝的包
但是我们每次转换的时候都会先register一遍转换代理类,而此类底层为每次register注册一个新生的代理类被加载到非堆
但是又被业务代码中的MAPPER_FACTORY引用,导致每次生成的实例充斥着年轻代又到老年代
最终的现象就是老年代、年轻代、非堆内存同时爆满,而又GC不掉,内存泄露直到溢出

代码处理

找到了具体的代码问题,我们将同一个类转换的register在系统启动时注入一次就行,不用每次调用注册,这样的话就不会频繁创建和加载,就可以解决上述问题

本地验证

本地验证错误使用代码,可以复现问题

加入 参数-verbose -verbose:gc 也 可以看到新增的代理类在循环中疯狂生成与加载, 修复后本地监控数据平稳运行,具体图标参考预发验证图表

预发验证

预发验证后续我们还将采用压测排除性能与其他内存问题,此次排除结束。

后记

此次问题还是属于比较常见的内存溢出分析,整体按着常用流程没有太多的难点,只有在分析register的时候一时定位不到是开源包的register方法调用的原因(虽然事后感觉很简单,当时也是耗费了30分钟左右才发现)。
troube shooting 三要素: 锻炼自己的逻辑思维、锻炼自己的技术能力、多看多查

Java中Groovy脚本执行引发的MetaSpace内存泄露分析与解决方案 在Java应用开发中,动态脚本执行是扩展系统灵活性的常见需求,Groovy作为JVM上的动态语言,因其与Java的无缝集成和强大的动态能力被广泛应用于规则引擎、工作流和插件系统等场景。其核心原理是通过GroovyClassLoader动态编译脚本为Java类并加载到JVM的MetaSpace(元空间)中。然而,若ClassLoader生命周期管理不当,动态生成的类及其元数据将无法被垃圾回收,导致MetaSpace内存持续增长直至OOM,这就是典型的内存泄露问题。该问题的技术价值在于揭示了JVM类加载与卸载机 阅读详情

相关推荐

ThreadLocal内存泄露原理与Java生产环境防范

ThreadLocal作为Java线程封闭技术的典型实现,通过ThreadLocalMap为每个线程维护变量副本,实现无锁线程安全访问。其核心风险在于线程池场景下,当ThreadLocal对象失去强引用后,Entry的value仍保持强引用导致内存堆积。这种内存泄露模式属于JVM老年代内存溢出的高频诱因,常见于Web上下文传递、数据库连接管理等场景。通过MAT分析Thread对象的threadLocals字段,可发现null key的残留Entry是典型特征。最佳实践包括强制try-finally清理、使用

weixin_33795806的博客 306

线上java内存泄露处理实录1

线上现象(各种监控数据) 1.公司项目在监控平台上开始报警(jvm堆内存占用报警,FullGC次数超频率报警) 2.观察具体的监控图标(预发机器) 线程数平稳(260左右) 3. 方法监控可以看到在fullGC比较频繁时,业务方法几乎无响应 线上配置(jvm配置,运行时内存分布) 项目版本:jdk8 ,spring 5, 默认垃圾处理器 Parallel GC with 43 thr...

weixin_33943347的博客 164

高通平台Camera sensor bring up!

Qualcomm Camera sensor bring up!0. 准确1. Kernel 底层驱动配置1.1 dtsi1.2 pinctrl2. Chi-Cdk XML 配置2.1 sensormodule2.2 sensor3. CHECK 本文主要针对高通平台SM7250进行描述,当然高通平台可能基本都差不多【第一个项目】 —only for sensor probe sucess. 0....

Understand-image 9239

java获取内存dump的几种方式

前不久,上线了一个新项目,这个项目是一个压测系统,可以简单的看做通过回放词表(http请求数据),不断地向服务发送请求,以达到压测服务的目的。在测试过程中,一切还算顺利,修复了几个小bug后,就上线了。在上线后给到第一个业务方使用时,就发现来一个严重的问题,应用大概跑了10多分钟,就收到了大量的Full GC 的告警。 针对这一问题,我们首先和业务方确认了压测的场景内容,回放的词表数量大概是10万条,回放的速率单机在 100qps左右,按照我们之前的预估,这远远低于单机能承受的极限。按道理是不会产生内存问.

DreamSun的博客 7411

基于文件通信的QMT量化交易信号桥接方案设计与实现

在量化交易系统开发中,进程间通信(IPC)是连接不同计算模块、实现策略逻辑与交易执行解耦的关键技术。其核心原理在于允许运行于独立环境或进程的程序安全、可靠地交换数据。文件系统通信作为一种经典的IPC方法,因其实现简单、跨平台兼容性好且数据可持久化,在非高频场景下具有重要技术价值。它尤其适用于需要将外部复杂计算环境(如配备丰富数据科学库的Python环境)与专用交易终端(如迅投QMT)集成的应用场景。通过约定文件路径与数据格式,外部程序可将包含交易指令的JSON信号文件写入特定目录,而交易终端通过轮询或监听机

weixin_28678151的博客 419

国土变更调查中六类拓扑错误的成因分析与高效修复实践

本文深入分析了国土变更调查中六类拓扑错误的成因,包括边界不一致和不规则图形等常见问题,并提出了高效的自动化修复实践。通过智能咬合算法、引力-斥力平衡模型等核心技术,显著提升了修复效率,节省人工质检时间70%。文章还分享了实战中的避坑指南和黄金法则,为相关从业人员提供了宝贵经验。

weixin_29202213的博客 359

Java 中的内存泄漏

什么是 Java 中的内存泄漏? 当应用程序持有不再需要的对象引用时,就会发生 Java 内存泄漏。这些意外的对象引用阻止内置的 Java 垃圾收集机制释放这些对象消耗的内存,最终导致致命的OutOfMemoryError。 简而言之,内存泄漏是- 不再需要的对象引用,仍然存在于 HEAP 内存中,垃圾收集器无法删除它们。 发生内存泄漏的最常见场景: 没有正确使用静态成员。 未关闭的...

qq_37116560的博客 3394

Verilog 并行 FIR 滤波器设计

FIR(Finite Impulse Response)滤波器是一种有限长单位冲激响应滤波器,又称为非递归型滤波器。FIR 滤波器具有严格的线性相频特性,同时其单位响应是有限长的,因而是稳定的系统,在数字通信、图像处理等领域都有着广泛的应用。

m0_61687959的博客 1604

Java 内存泄露问题详解

内存泄露指的是程序运行时未能正确释放不再使用的内存资源,导致这些内存资源无法被垃圾回收器回收和重新利用。内存泄露会导致程序占用越来越多的内存,最终可能导致内存耗尽和程序崩溃。在Java中,当一个对象不再被引用时,Java的垃圾回收器会自动将其标记为可回收,并在合适的时机释放其占用的内存。然而,如果存在内存泄露的情况,这些不再使用的对象仍然被保留在内存中,无法被垃圾回收器回收。内存泄露可能是由于编程错误、资源管理不当或设计问题引起的。

swadian2008的博客 4938

从多项式到神经网络:DPD算法演进史及其在RRU中的工程实现

本文系统梳理了数字预失真(DPD)算法从经典多项式模型、查表法到神经网络驱动的演进历程,并深入探讨了其在基站射频单元(RRU)中面临的硬件资源约束与工程实现挑战。文章为通信设备的技术决策者提供了算法选型、性能权衡及混合架构设计的实用评估框架,助力在性能、功耗与成本间找到最优平衡。

cherry的博客 1076

微信小程序 - 详细实现随机生成订单号,微信小程序创建订单号思路,不重复订单号生成的方法,小程序自动生成固定规则的订单号流水号(必须是唯一不重复的订单号,生成唯一订单号)详细生成方法,示例代码教程最新

微信小程序,vue2,vue3,订单号,流水号思路,微信小程序 详细实现随机生成订单号(JavaScript),随机生成商户订单号,根据当前时间随机生成流水号或者订单号,微信小程序之商家订单,订单号随机生成器,自动生成固定规则的订单号(前缀+采购日期+6位流水号)微信小程序 生成外卖顺序号,生成订单号或流水号简单方法,实现订单号生成唯一的解决方案,如何按日期生成订单号,14位编号=8位日期(+6位流水号),自动生成订单号(固定+日期+数字),销售订单号自动生成。在微信小程序开发中,详解实现随机生成创建订单号

🏆 前端领域优质创作者 1186

加载页面数据时内存突然爆满_线上java内存泄露处理实录

线上现象(各种监控数据)1.公司项目在监控平台上开始报警(jvm堆内存占用报警,FullGC次数超频率报警)2.观察具体的监控图标(预发机器) 线程数平稳(260左右)方法监控可以看到在fullGC比较频繁时,业务方法几乎无响应线上配置(jvm配置,运行时内存分布)项目版本:jdk8 ,spring 5, 默认垃圾处理器 Parallel GC with 43 thread(s) -Xms800m...

weixin_39790686的博客 156

STM32声源定位:实现声源定位的嵌入式解决方案

通过以上代码,我们可以获取麦克风音频信号样本,并使用交叉相关法计算声源的位置。然而,我可以帮助您解答有关STM32声源定位的问题,提供相关的代码和指导。获取了麦克风音频信号后,我们可以使用信号处理算法来计算声源的位置。该算法通过计算不同麦克风之间的信号延迟来确定声源的方向。首先,我们需要获取每个麦克风的音频信号。声源定位是一项重要的技术,可以帮助我们确定声音的来源位置。在嵌入式系统中,使用STM32微控制器可以实现精确的声源定位。声源定位的基本原理是通过多个麦克风阵列接收到的声音信号来计算声源的位置。

UplKubernetes的博客 2581

Java死锁与内存泄露排查实战:从监控告警到根因定位

在Java应用开发中,死锁和内存泄露是两类典型的性能问题,它们直接影响系统的稳定性和响应能力。死锁源于多线程环境下资源竞争与循环等待,会导致线程无限阻塞;内存泄露则因对象引用未被及时释放,引发垃圾回收失效。这两类问题的技术价值在于,其排查过程能深刻揭示应用并发设计与资源管理的内在逻辑。在实际应用场景中,它们常通过接口超时、内存持续增长等现象暴露。本文聚焦于使用jstack、jmap等JDK工具进行问题诊断,并结合Arthas实现在线动态分析,为工程师提供从现象感知到根因定位的系统化排查路径。

weixin_33980459的博客 411

Unreal5.6从入门到精通之 如何实现MetaHuman数字人

本文介绍了使用HYPER3D-ChatAvatar网站生成3D头部模型,并导入Unreal Engine制作数字人的完整流程。首先上传照片生成头部模型(约2分钟),设置参数后下载模型文件。然后在UE5.6中创建项目,激活MetaHuman插件,导入头部模型并调整肤色、面部特征和身体模板。通过MetaHuman Creator组装数字人蓝图,支持添加音频/视频动画功能。关键步骤包括:取消Rigging选项节省时间、切换英文模式避免材质问题、使用Live Link Face应用实现面部捕捉等。整个流程约需5-1

TxNet 1348

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

每日面试实录·滴滴·校招·JAVA

一面能基本应对,虽然有卡顿但还能接住;二面加压之后暴露了知识点的“理解盲区”和“记忆边界”问题,像线程池异常处理、分布式锁底层、GC 等场景性题目都属于实战积累不足导致。📌建议补强方向线程池全流程 & 源码级别掌握MySQL 索引失效、锁机制、事务隔离级别再深入JVM GC 触发条件和对象存活判断分布式锁 & SpringBoot 核心注解体系记牢系统优化 & 排查技巧需通过实战训练补足。

HELLO_E_SIR的博客 1507

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!

“小王啊,知道为什么我头发这么少吗?那内存泄漏的速度比理发店推子还快!“

再小的帆也能远航,把分享变成一种习惯 900

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

从内存泄露到服务瘫痪:CVE-2025-5777漏洞原理与实战利用框架解析

内存泄露是程序在动态分配内存后未能正确释放的一种常见缺陷,与直接导致崩溃的内存溢出不同,它如同慢性病,会随着时间推移不断累积,最终耗尽系统资源。其核心原理往往与不当的资源生命周期管理有关,例如在多线程环境下,ThreadLocal变量若未在异常路径或特定逻辑分支中及时清理,就会导致线程私有数据无法回收,引发持续的内存占用。这类漏洞的技术价值在于其隐蔽性和持续性,攻击者无需直接执行代码,即可通过资源耗尽实现拒绝服务,为后续攻击创造条件。在应用场景上,内存泄露常见于高并发网络设备、Web服务器中间件等长期运行的

weixin_33937778的博客 436

互联网大厂Java求职面试实录:当严肃面试官遇上搞笑程序员谢飞机

Spring是一个开源的Java应用程序框架,提供了全面的基础架构支持,特别是用于开发复杂的企业应用程序。:Docker是一个开源的应用容器引擎,允许开发者将应用程序及其依赖项打包到一个可移植的容器中,并可以在任何Linux机器上运行。:单例模式是一种软件设计模式,确保一个类只有一个实例,并提供对该实例的全局访问。:这是一个可重入的互斥锁,与synchronized不同,它提供了更多的功能,比如公平锁、可中断锁、超时锁等。面试官:好的,今天的面试到此结束,我们会再联系你。那你知道什么是JVM中的GC吗?

OnceAgain_L的博客 500

互联网大厂Java求职面试实录:谢飞机的搞笑答题之旅

本次面试场景设定在某互联网大厂,面试官(以下简称"官")对求职者谢飞机(以下简称"谢")进行严肃技术问答。谢飞机时而答得专业,时而答得搞笑,让我们通过三轮提问一窥大厂Java面试风采。

zhouxiaohei_的博客 346

面试现场:严肃面试官与搞笑水货谢飞机的Java大厂“三连击“问答实录

1.HashMap 1.7和1.8的数据结构差异?2.ArrayList扩容机制?3.用Synchronized实现卖票程序。更多完整答案解析请访问文末GitHub链接(包含DDD领域建模图、线程池参数计算公式等)《面试现场:严肃面试官与搞笑水货谢飞机的Java大厂"三连击"问答实录》

qq_18126657的博客 317

2024年最全大厂Android中高级岗面试原题(阿里、百度、京东、饿了么(2),小程序FMP优化实录

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。需要这份系统化的资料的朋友,可以添加戳这里获取一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长! 既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!由于文件比较多,这里只是将

2401_84931693的博客 1078

小程序FMP优化实录,快来收藏!

前言 我也已经做了好几年开发了,还记得刚出来工作的时候觉得自己很牛逼,现在回想起来也蛮好笑的。懂的越多的时候你才会发现懂的越少。因为如果你的知识是一个圆,当你的圆越大时,圆外面的世界也就越大。 最近看到很多Android新手问Android学习路线,学习方法啊,如何入门啊,所以我从网上找了一些资料,然后以我的工作经验给大家总结一下,让大家少走弯路,提取一些工作中经常用到的技术。当然,说一千道一万,最重要的还是学以致用,把学过的知识融会贯通。 面试 一面 面试官:先介绍一下自己吧,做过哪些项目,掌握哪些技能

fanzhang_vip0723的博客 268

2024 国内互联网公司的Android工程师薪酬排名!看看你是什么水平

在阿里的时候我作为面试官接触过几十个面试者,能左右我是不是通过这个人的,主要因素还是这个人对技术的热爱程度。最近很多人私聊我说关于大厂面试有很多算法题不会,以及缺少最新的面试经验和资料,这份刷题实录,也让很多人进入了心仪的大厂。68、烧一根不均匀的绳,从头烧到尾总共需要1个小时。9、string-stringbuffer-stringbuilder区别-小米-乐视-百度。整个刷题实录内容,包括 **双子针、动态规划、二分查找、贪心算法、深度优先。搜索、字符串、递归、字典树、排序、链表等相关专题内容。

2401_86964146的博客 1518
上一篇: 面试官问我“Java中的锁有哪些?以及区别”,我跪了
下一篇: Spring Boot 中实现定时任务的两种方式
Java_No2
博客等级 码龄7年 20粉丝 109原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值