
通过dump文件分析,发现大量jaeger对象没能及时回收。
用了线程池异步报价,新起的线程是没有trace的。 但是我们早期有个针对消息的优化,使用logback filter在没有trace的时会自动生成一个trace。 生成的trace使用MDC.put(“X-B3-TraceId”, traceId)存放在ThreadLocal,在使用线程池时,因线程不回收,导致trace一直不变。 而LogData对象使用了map保存trace,导致线程池里相同trace的日志越来越大,而且无法回收,造成内存泄漏。
线程池优化
1.采用 TracedExecutorService
2.采用TtlExecutors.getTtlExecutorService()包装ExecutorService
3.采用@Async 标注方法异步线程执行
内存泄漏的根源是
0.2.2 版本以前的 opentracing-spring-cloud-starter 中的 TraceAsyncAspect 是未关闭 ThreadLocalScope 导致
详见原GitHub Issue https://github.com/opentracing-contrib/java-spring-cloud/issues/185
解决方案
升级 opentracing-spring-cloud-starter 到 0.2.2 及更新版本
添加配置 opentracing.spring.cloud.async.enabled=false,禁用对异步调用的链路追踪功能
版权声明:本文为qishao1101原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。