案例 1: 某财险承保系统内存泄漏问题

本文最后更新于:2021年11月27日 下午

一 内存泄漏情况说明

今天使用 Dynatrace 检查发现 callCenter 的应用存在内存泄漏的情况。具体如下:
在过去 6H 内,OLD 区内存使用量在持续增长,最终达到 99.98%。且大部分 OLD 区内存无法 GC。同时因频繁 GC,导致 JVM “STOP THE WORLD”的时间越来越大。严重影响业务性能。

对业务性能的影响如下图所示:

折线图是不包含挂起(stop the world)的响应时间,柱状图是包含挂起的响应时间。可以看到对业务的响应时间造成了一定的影响。

二 内存泄漏分析

使用 Dynatrace 分析结果如下:

  1. 确实存在内存泄漏。(相关资料可以在 Dynatrace 的下列路径中查看分析结果)
  2. 泄漏的实例主要是 ConcurrentHashMap”dubboLruCacheConcurrentHashMap 也是 dubboLRUcache调用的)如下图:
  3. 泄漏的根源如下:com.alibaba.dubbo.common.extension.ExtensionLoadercom.alibaba.dubbo.cache.support.lru.LruCacheFactory
  4. LRU 类的相关细节如下:

三 总结

综上,dubbo 的 LRU 相关的类导致了内存泄漏。

可能的原因有:LRU 缓存的 cache size 大小有问题;expire 时间有问题;或者是相关 cache 一直存在引用,导致无法 GC。

还请优化相关代码,避免出现内存泄漏的情况。

系列文章

  1. 8 种 Java 内存溢出之一:Java Heap Space
  2. 案例 1: 某财险承保系统内存泄漏问题
  3. 8 种 Java- 内存溢出之二 -GC overhead limit exceeded
  4. 案例 2: 某寿险公司核心系统 GC 开销超限问题分析
  5. 8 种 Java- 内存溢出之三 -Permgen space
  6. 案例 3: 某财险公司运行时的 Perm 区内存溢出分析
  7. 8 种 Java- 内存溢出之四 -Metaspace
  8. 8 种 Java- 内存溢出之五 -Unable to create new native thread
  9. 8 种 Java- 内存溢出六 -Out of swap space?
  10. 8 种 Java 内存溢出之七 -Requested array size exceeds VM limit
  11. 8 种 Java 内存溢出之八 -Kill process or sacrifice child

案例 1: 某财险承保系统内存泄漏问题
https://ewhisper.cn/posts/37878/
作者
东风微鸣
发布于
2017年10月30日
许可协议