案例 1: 某财险承保系统内存泄漏问题
本文最后更新于:2024年7月24日 晚上
一 内存泄漏情况说明
今天使用 Dynatrace 检查发现 callCenter 的应用存在内存泄漏的情况。具体如下:
在过去 6H 内,OLD 区内存使用量在持续增长,最终达到 99.98%。且大部分 OLD 区内存无法 GC。同时因频繁 GC,导致 JVM “STOP THE WORLD”的时间越来越大。严重影响业务性能。
对业务性能的影响如下图所示:
折线图是不包含挂起(stop the world)的响应时间,柱状图是包含挂起的响应时间。可以看到对业务的响应时间造成了一定的影响。
二 内存泄漏分析
使用 Dynatrace 分析结果如下:
- 确实存在内存泄漏。(相关资料可以在 Dynatrace 的下列路径中查看分析结果)
- 泄漏的实例主要是
ConcurrentHashMap”
和dubbo的LruCache
(ConcurrentHashMap
也是 dubbo 的LRUcache
调用的)如下图:
- 泄漏的根源如下:
com.alibaba.dubbo.common.extension.ExtensionLoader
和com.alibaba.dubbo.cache.support.lru.LruCacheFactory
- LRU 类的相关细节如下:
三 总结
综上,dubbo 的 LRU 相关的类导致了内存泄漏。
可能的原因有:LRU 缓存的 cache size 大小有问题;expire 时间有问题;或者是相关 cache 一直存在引用,导致无法 GC。
还请优化相关代码,避免出现内存泄漏的情况。
系列文章
- 8 种 Java 内存溢出之一:Java Heap Space
- 案例 1: 某财险承保系统内存泄漏问题
- 8 种 Java- 内存溢出之二 -GC overhead limit exceeded
- 案例 2: 某寿险公司核心系统 GC 开销超限问题分析
- 8 种 Java- 内存溢出之三 -Permgen space
- 案例 3: 某财险公司运行时的 Perm 区内存溢出分析
- 8 种 Java- 内存溢出之四 -Metaspace
- 8 种 Java- 内存溢出之五 -Unable to create new native thread
- 8 种 Java- 内存溢出六 -Out of swap space?
- 8 种 Java 内存溢出之七 -Requested array size exceeds VM limit
- 8 种 Java 内存溢出之八 -Kill process or sacrifice child
案例 1: 某财险承保系统内存泄漏问题
https://ewhisper.cn/posts/37878/