美文网首页JavaJava 杂谈
线上java内存泄露处理实录

线上java内存泄露处理实录

作者: 4553675200ad | 来源:发表于2019-05-30 16:36 被阅读0次

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

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内存泄露处理实录

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

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

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

  • Java弱引用学习 WeakHashMap、ReferenceQ

    上一篇文章 Java内存泄露学习 ThreadLocal真的会内存泄露吗 提到ThreadLocal内存泄露的问题...

  • Java 内存泄露处理思路

    不过先还是介绍下最基本防止泄漏原理: 1、资源释放问题(具体的就是数据库连接、socket连接等) 2、避免频繁创...

  • Java 内存结构备忘录

    本文详细描述了 Java 堆内存模型,垃圾回收算法以及处理内存泄露的最佳方案,并辅之以图表,希望能对理解 Java...

  • Java内存泄漏

    本文将会介绍: C++中的内存泄露 Java内存管理与垃圾回收 Java中的内存泄漏 一、C++中的内存泄露 在大...

  • Android使用Handler造成内存泄露的分析及解决方法

    阅读目录 一、什么是内存泄露? 二、内存泄露的危害 三、解决方案 四、总结 一、什么是内存泄露? Java使用有向...

  • 内存优化

    内存优化,主要来处理:内存泄露,内存抖动 Java虚拟机 运行时数据区域分为 共享数据区1.方法区ClassLoa...

  • troubleshoot之:使用JFR解决内存泄露

    简介 虽然java有自动化的GC,但是还会有内存泄露的情况。当然java中的内存泄露跟C++中的泄露不同。 在C+...

  • 人生苦短,我学java之内存泄露

    本文详细地介绍了Java内存管理的原理,以及内存泄露产生的原因,同时提供了一些列解决Java内存泄露的方案,希望对...

网友评论

    本文标题:线上java内存泄露处理实录

    本文链接:https://www.haomeiwen.com/subject/cipvtctx.html