主要观点总结
本文主要讲述了由于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: 总结
文章详细描述了整个内存分配的流程,包括自定义内存分配器的使用,以及操作系统层面的内存管理。总结了问题的根本原因和解决方案。
免责声明:本文内容摘要由平台算法生成,仅为信息导航参考,不代表原文立场或观点。
原文内容版权归原作者所有,如您为原作者并希望删除该摘要或链接,请通过
【版权申诉通道】联系我们处理。