java内存泄漏问题排查和JVM调优

2025-12-04 0 407

Java语言本身支持垃圾自动回收,在日常编程中我们几乎没有关注过对象回收的问题。解决内存泄漏可能停留在八股文上。今天分享一次项目中内存泄漏的排查流程到最终解决。

java自带了强大的命令行工具

工具 核心功能 主要应用场景 关键命令/示例
**jcmd**​ 多功能诊断:一个强大的“瑞士军刀”,可执行丰富的诊断命令,涵盖JVM状态查询、内存、线程、GC控制等。 综合诊断与运维:获取完整JVM信息(参数、属性)、动态控制(触发GC、开启JFR)、生成线程/堆转储。 jcmd VM.flags(查看JVM参数) jcmd Thread.print(生成线程转储) jcmd GC.heap_dump(生成堆转储)
**jmap**​ 堆内存分析:专用于Java堆内存(Heap Memory)的直方图统计和堆转储(Heap Dump)文件生成。 深度内存分析:排查内存泄漏、分析堆内对象分布、生成堆转储文件供MAT等工具深度分析。 jmap -histo:live (存活对象直方图) jmap -dump:live,format=b,file=heap.hprof (生成堆转储)
**jstat**​ JVM统计监控:持续监控JVM各种运行时指标,特别是垃圾回收(GC)相关数据和类加载信息。 实时性能监控:监控GC行为(频率、耗时)、各内存区使用率、类加载/卸载情况,用于性能调优 jstat -gcutil (GC情况摘要) jstat -gc 1000 5(GC详情,每秒1次共5次)

Java垃圾回收算法

Java垃圾回收算法,分代垃圾回收算法

  • 新生代:复制算法
  • 老年代:标记-清除算法和标记-整理算法

排查思路

在解决问题的时候,先了解下我们项目JVM参数信息.

jcmd  VM.flags
-XX:CICompilerCount=15 -XX:InitialHeapSize=1031798784 -XX:MaxHeapSize=16489906176 -XX:MaxNewSize=5496635392 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=343932928 -XX:OldSize=687865856 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:+UseParallelGC

第一种情况:

项目运行在linux服务器上,进行压测,内存以肉眼可见的速度上升。
使用top命令查看进程占用内存情况。

java内存泄漏问题排查和JVM调优
这里主要关注下RES
进程当前实际使用的、未被换出到交换空间(swap out)的物理内存。包含堆内存、非堆内存、堆外内存等。如果RES值持续上升,堆内存保持稳定,说明堆外内存在上升。

这个时候开始考虑使用jmap获取堆转存储。分析那些对象产生的泄漏。

常见的内存泄漏,

HashMap 、队列、线程池、websocket等资源没有正确的释放,另外一种是我们的程序调用了native方法,但没有释放资源。

发现泄漏后,最直接的办法生成jvm对象快照。生成堆转储文件,

内存分析工具

MAT(Memory Analyzer Tool) :最常用的堆分析工具,支持自动检测泄漏嫌疑人(Leak Suspects)

java内存泄漏问题排查和JVM调优
泄漏嫌疑直接能看到使用websocket相关操作导致的

关键分析步骤:
  1. 识别 “可疑大对象”

    • 在 MAT 中查看 “Histogram”(直方图),按 “Retained Heap”(对象被回收后可释放的内存)排序,找出占用内存前几名的类(如某业务 POJO、集合类)。
    • 关注 “Shallow Heap”(对象本身大小)小但 “Retained Heap” 大的对象(通常是集合,持有大量子对象引用)。
  2. 追溯引用链(支配树 / 引用树)

    • 对可疑对象右键选择 “Merge Shortest Paths to GC Roots”(排除弱引用 / 软引用等可被 GC 自动回收的引用类型),查看谁在 “强引用” 该对象。
    • 核心是找到 “根对象”(如静态变量、线程对象、类加载器),这些对象不会被 GC 回收,若其引用链中包含本应释放的对象,则导致泄漏。

    例:若发现大量User对象被HashMap持有,且HashMapUserCache类的静态变量,而UserCache未设置过期清理逻辑,则可定位为 “静态缓存未释放” 导致的泄漏。

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

申明:本文由第三方发布,内容仅代表作者观点,与本网站无关。对本文以及其中全部或者部分内容的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。本网发布或转载文章出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,也不代表本网对其真实性负责。

左子网 开发教程 java内存泄漏问题排查和JVM调优 https://www.zuozi.net/3618.html

常见问题
  • 1、自动:拍下后,点击(下载)链接即可下载;2、手动:拍下后,联系卖家发放即可或者联系官方找开发者发货。
查看详情
  • 1、源码默认交易周期:手动发货商品为1-3天,并且用户付款金额将会进入平台担保直到交易完成或者3-7天即可发放,如遇纠纷无限期延长收款金额直至纠纷解决或者退款!;
查看详情
  • 1、描述:源码描述(含标题)与实际源码不一致的(例:货不对板); 2、演示:有演示站时,与实际源码小于95%一致的(但描述中有”不保证完全一样、有变化的可能性”类似显著声明的除外); 3、发货:不发货可无理由退款; 4、安装:免费提供安装服务的源码但卖家不履行的; 5、收费:价格虚标,额外收取其他费用的(但描述中有显著声明或双方交易前有商定的除外); 6、其他:如质量方面的硬性常规问题BUG等。 注:经核实符合上述任一,均支持退款,但卖家予以积极解决问题则除外。
查看详情
  • 1、左子会对双方交易的过程及交易商品的快照进行永久存档,以确保交易的真实、有效、安全! 2、左子无法对如“永久包更新”、“永久技术支持”等类似交易之后的商家承诺做担保,请买家自行鉴别; 3、在源码同时有网站演示与图片演示,且站演与图演不一致时,默认按图演作为纠纷评判依据(特别声明或有商定除外); 4、在没有”无任何正当退款依据”的前提下,商品写有”一旦售出,概不支持退款”等类似的声明,视为无效声明; 5、在未拍下前,双方在QQ上所商定的交易内容,亦可成为纠纷评判依据(商定与描述冲突时,商定为准); 6、因聊天记录可作为纠纷评判依据,故双方联系时,只与对方在左子上所留的QQ、手机号沟通,以防对方不承认自我承诺。 7、虽然交易产生纠纷的几率很小,但一定要保留如聊天记录、手机短信等这样的重要信息,以防产生纠纷时便于左子介入快速处理。
查看详情

相关文章

猜你喜欢
发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务