java并发问题排查
一个Web服务,用ThreadLocal存当前请求用户的上下文,压测一段时间后频发fullgc,用mat分析dump,发现大量的ThreadLocalMap的,entry无法回收,要怎么定位和解决?
内存泄漏的根本原因,ThreadLocal底层是每个线程内部的ThreadLocalMap,entry的key是对ThreadLocal实例的弱引用value是你存的数据是强引用,当ThreadLocal实例没有把外部强引用的时候,GC会把弱引用的key回收成null,但是value还存在一条强引用链,线程到ThreadLocalMap,再到entry,再到value,只要线程池还活着,线程池里的线程长期存活,这个value就永远没办法回收,这就是内存泄漏的一个根本原因,但更致命的不是泄漏而是线程复用,导致数据串读,Tomcat处理完成请求A,线程还活着,ThreadLocalMap里残留着A的用户信息,如果没有调用remove,这个线程就会被复用,处理请求B,B一读ThreadLocal,直接拿到了A的数据,用户B看到了用户A的隐私信息,线上P0级的事故,这才是线程复用的真正噩梦,正确做法也很简单,永远在finally里调用remove。
但是面试官不是想听这个,而是异步场景下的上下文传递,比如主线程用线程池提交异步任务,子线程也要拿到主线程的servlet上下文,如阿里的TTL,它用装饰模式,任务提交时捕获当前的线程的上下文快照,执行的时候,恢复到子线程,执行完再去清理,完美解决了线程池复用场景下的上下文传递问题。这才是大厂P7的答案。
AI总结:
这是 ThreadLocal 在 Web 线程池模型下的经典问题,表象是压测后频繁 Full GC、内存泄漏,深层还隐藏着用户数据串扰的严重业务风险。考察点从底层原理、编码规范到工业级异步方案层层递进。
一、问题根因分析
1. 内存泄漏的底层原理
ThreadLocal 的内部存储结构是:每个线程 Thread 内部维护一个 ThreadLocalMap,Map 的 Entry 继承自 WeakReference;其中 Entry 的 key 是对 ThreadLocal 实例的弱引用,value 是存储的业务上下文数据,为强引用。
内存泄漏的完整链路:
当 ThreadLocal 实例外部没有强引用时,GC 会回收弱引用的 key(变为 null),但 value 始终存在一条强引用链:Thread → ThreadLocalMap → Entry → value。
而 Web 服务(Tomcat/Jetty)都采用线程池模型,线程是长期存活、复用的,不会随单个请求结束而销毁,因此 value 永远无法被 GC 回收。大量 key 为 null 的 Entry 持续堆积,最终导致老年代占满,触发频繁 Full GC。
2. 更致命的风险:线程复用导致数据串扰
这是比内存泄漏更严重的 P0 级业务风险,也是很多人容易忽略的点。
线程池处理完请求 A 后,线程不会销毁,ThreadLocalMap 中会残留 A 的用户上下文;当该线程被复用来处理请求 B 时,如果没有主动清理,请求 B 可以直接读取到用户 A 的隐私数据,造成越权、数据泄露等严重事故。
二、分场景解决方案
1. 基础同步场景:编码规范解法(面试及格分)
对于同步请求链路,标准解法是:在 finally 代码块中强制调用 ThreadLocal.remove (),请求处理完成后主动清理当前线程的 Entry,从根源避免 value 残留。
这是最基础的编码规范,但只能覆盖同步请求场景,也是面试官默认的基础答案。
2. 进阶异步场景:TransmittableThreadLocal(TTL)方案(大厂高阶答案)
真实业务中经常会在请求线程中提交异步任务到线程池,子线程同样需要获取请求上下文。普通 ThreadLocal 无法跨线程传递,且子线程复用依然存在泄漏和串扰问题,这才是真正考察深度的点。
工业级标准方案是阿里开源的 TransmittableThreadLocal(TTL),核心思路是装饰器模式 + 上下文快照传递:
- 任务提交到线程池时,自动捕获主线程的 ThreadLocal 上下文快照;
- 任务在子线程执行前,将快照恢复到子线程的 ThreadLocal 中;
- 任务执行完成后,自动清理子线程的上下文,避免线程复用残留。
既解决了异步场景下的上下文跨线程传递,也从机制上保证了线程复用场景下的自动清理,同时规避了内存泄漏和数据串扰。
三、考察点总结
这个问题的分层考察逻辑很清晰:
- 基础层:考 ThreadLocal 的内存泄漏原理,看对底层结构的理解;
- 进阶层:考线程复用的数据串扰风险,看对 Web 线程模型的实战理解;
- 高阶层:考异步线程池的上下文传递方案,看对工业级解决方案的积累。

浙公网安备 33010602011771号