专栏名称: 终码一生
提供免费JB账号,激活码,破解工具下载;分享Java开发技术(JVM,多线程,高并发,性能调优),开源项目,常见开发问题和前沿科技资讯等!
TodayRss-海外RSS稳定源
目录
今天看啥  ›  专栏  ›  终码一生

记一次堆外内存泄露,整个团队通宵处理到爆肝!

终码一生  · 公众号  ·  · 2025-09-17 21:44
    

主要观点总结

本文主要讲述了由于MCC扫包配置问题导致的SpringBoot应用内存问题,深入探究了内存分配和释放的过程,并给出了解决方案。

关键观点总结

关键观点1: 问题背景

文章描述了一个SpringBoot应用迁移到MDP框架后频繁出现Swap区域使用量过高的异常,实际使用的物理内存高于配置值。

关键观点2: 排查过程

使用了Java层面的工具定位内存区域,包括堆内内存、Code区域以及通过unsafe.allocateMemory和DirectByteBuffer申请的堆外内存。然后使用了系统层面的工具定位堆外内存问题,包括gperftools、strace、GDB等。

关键观点3: 问题原因

最终发现问题是由于MCC(美团统一配置中心)使用了Reflections进行扫包,底层使用了SpringBoot加载JAR。解压JAR使用Inflater类需要用到堆外内存,而SpringBoot没有主动释放这部分内存。

关键观点4: 解决方案

修改MCC的配置路径为特定的JAR包,避免扫描所有包;升级SpringBoot到最新版本,ZipInflaterInputStream会主动释放堆外内存。

关键观点5: 总结

文章详细描述了整个内存分配的流程,包括自定义内存分配器的使用,以及操作系统层面的内存管理。总结了问题的根本原因和解决方案。


免责声明:本文内容摘要由平台算法生成,仅为信息导航参考,不代表原文立场或观点。 原文内容版权归原作者所有,如您为原作者并希望删除该摘要或链接,请通过 【版权申诉通道】联系我们处理。

原文地址:访问原文地址
总结与预览地址:访问总结与预览
文章地址: 访问文章快照