ThreadLocal没remove内存慢慢涨最后OOM了 线上服务跑了三天突然 OOM 挂了。重启三天后又挂了。内存 dump 拉下来用 MAT 一看——堆里有几十万个UserContext对象全被 ThreadLocal 引着GC 收不掉。排查代码里有个全局的用户信息持有者publicclassUserContext{privatestaticfinalThreadLocalUserCURRENT_USERnewThreadLocal();publicstaticvoidset(Useruser){CURRENT_USER.set(user);}publicstaticUserget(){returnCURRENT_USER.get();}}每个请求进来Filter 把用户信息塞进去UserContext.set(currentUser);chain.doFilter(request,response);问题在哪Filter 的doFilter执行完后——没调remove()。线程回到线程池ThreadLocal 里的 User 对象还挂着。下一个请求如果是另一个用户ThreadLocal 被set覆盖旧 User 对象失去了强引用——但 ThreadLocal 内部的 Entry 还在弱引用的 key 被 GC 了value 却因为线程没死而一直存在。这就是 ThreadLocal 内存泄漏的标准剧本。根因ThreadLocal 的内存模型ThreadLocal 不存数据——数据存在 Thread 对象里的ThreadLocalMap。每个 Thread 有一个 Mapkey 是 ThreadLocal 的弱引用value 是你塞进去的对象。Thread → ThreadLocalMap → Entry[弱引用→ThreadLocal, 强引用→User]线程跑完回到线程池线程没死 → ThreadLocalMap 没清 → Entry 还在。GC 回收了 ThreadLocal 对象本身因为是弱引用但valueUser是强引用不收。这个 value 就永远挂在 Thread 的 ThreadLocalMap 里直到线程销毁。正确写法finally 里 removetry{UserContext.set(currentUser);chain.doFilter(request,response);}finally{UserContext.remove();// ✅ 必须清}remove()会删除 ThreadLocalMap 里对应的 Entryvalue 失去引用可以被 GC 回收。任何地方用了ThreadLocal.set()必须在 finally 里调remove()。没有例外。ThreadLocal 另外两个坑坑一线程池复用读到上一个任务的脏数据ThreadLocalStringtraceIdnewThreadLocal();// 任务1traceId.set(req-001);// 忘记 remove// 任务2同一个线程StringidtraceId.get();// → req-001脏数据日志里两个不同请求的 traceId 一样——排查链路全乱。坑二父子线程传递用 InheritableThreadLocal线程池不生效InheritableThreadLocalStringtlnewInheritableThreadLocal();tl.set(parent-value);newThread(()-{System.out.println(tl.get());// ✅ parent-value}).start();InheritableThreadLocal在创建子线程时会把父线程的值拷过去。但线程池里线程是复用的只在第一次创建时拷贝一次后面不会更新。线程池场景用阿里的TransmittableThreadLocalTransmittableThreadLocalStringtlnewTransmittableThreadLocal();tl.set(value);executor.execute(TtlRunnable.get(()-{System.out.println(tl.get());// ✅ 每次都能拿到最新值}));ThreadLocal 三个原则用了set就必须在 finally 里remove线程池场景更要remove——线程不销毁泄漏累积父子线程传递用TransmittableThreadLocal别用InheritableThreadLocal四行代码的事忘了就是 OOM。关于作者无羡独立开发者全栈工程师专注 AI 应用与微服务架构。 分类技术复盘 个人博客 — 更多技术文章✨ 开发者福利整理 — 云服务资源汇总 软件工坊 — 我的技术分享 个人门户 — 独立开发作品全集

相关新闻

最新新闻

AI视频标题生成不是靠灵感,而是靠结构——拆解头部MCN机构正在用的6维评分矩阵(含Excel自动打分工具)

AI视频标题生成不是靠灵感,而是靠结构——拆解头部MCN机构正在用的6维评分矩阵(含Excel自动打分工具)

更多请点击: https://codechina.net 第一章:AI视频标题生成不是靠灵感,而是靠结构——拆解头部MCN机构正在用的6维评分矩阵(含Excel自动打分工具) 在短视频流量竞争白热化的今天,头部MCN机构早已摒弃“灵光…

2026/7/21 16:51:17
SF6综合测试仪:电力GIS断路器预防性试验选择与DLT 596深度判定

SF6综合测试仪:电力GIS断路器预防性试验选择与DLT 596深度判定

摘要在现代电力系统的核心枢纽中,六氟化硫(SF6)气体以其卓越的绝缘与灭弧性能,稳固地占据着气体绝缘开关设备(GIS)和断路器等高压电气设备“生命线”的地位。然而,这层无形的保护并非一劳永逸。…

2026/7/21 16:51:17
OneDev vs GitLab:轻量级自托管DevOps平台终极性能对比与选型指南

OneDev vs GitLab:轻量级自托管DevOps平台终极性能对比与选型指南

OneDev vs GitLab:轻量级自托管DevOps平台终极性能对比与选型指南 【免费下载链接】onedev The Unified and Autonomous Development Platform 项目地址: https://gitcode.com/gh_mirrors/on/onedev 在当今DevOps工具选型中,技术决策者面临一个重…

2026/7/21 16:51:17
企业 GEO 精细化运营:双工具递进,实现 AI 流量可持续增长

企业 GEO 精细化运营:双工具递进,实现 AI 流量可持续增长

当下,豆包、DeepSeek、腾讯元宝、Kimi 等大模型已经成为用户选购、对比产品的核心决策入口。大量品牌发现,即便布局大量宣传内容,依然会在 AI 问答场景陷入 “AI 隐身” 困境:推荐榜单缺席、排名靠后、AI 认知存在偏差、负面信息无…

2026/7/21 16:51:17
2026年北京市各区智能工厂奖补政策最全汇编

2026年北京市各区智能工厂奖补政策最全汇编

一、国家层面政策根据2026年7月发布的《关于开展2026年度智能工厂梯度培育行动的通知》(工信厅联通装函〔2026〕343号),智能工厂分为基础级、先进级、卓越级、领航级四个层级进行梯度培育:1、基础级与先进级:由省级主管…

2026/7/21 16:51:17
紧急通知:2024Q3起,未部署AI工作流的工程师将面临37%岗位响应延迟风险(附合规迁移路径)

紧急通知:2024Q3起,未部署AI工作流的工程师将面临37%岗位响应延迟风险(附合规迁移路径)

更多请点击: https://intelliparadigm.com 第一章:AI工作流重构工程师响应力的底层逻辑 AI工作流重构并非简单替换工具链,而是对工程响应力进行系统性重定义。其底层逻辑根植于三个不可分割的维度:状态可观测性、决策可推演性、…

2026/7/21 16:46:17

月新闻