一 内存泄漏情况说明
今天使用 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。
还请优化相关代码,避免出现内存泄漏的情况。