千家信息网

Java中ThreadLocal导致内存OOM的原因是什么

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,本篇内容介绍了"Java中ThreadLocal导致内存OOM的原因是什么"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细
千家信息网最后更新 2026年10月31日Java中ThreadLocal导致内存OOM的原因是什么

本篇内容介绍了"Java中ThreadLocal导致内存OOM的原因是什么"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

原因分析

ThreadLocal 导致内存 OOM 的原因是什么?

ThreadLocal 底层通过 ThreadLocalMap 存储数据

源码如下:

  • 当我们使用ThreadLocal.set()时,set的value与key(即业务自己定义的ThreadLocal类)会存储在ThreadLocalMap的Entry[]数组里

源码如下:

  • 其中Entry是实现了一个弱引用WeakReference,Entry的key(即业务方定义的 ThreadLocal类)会被包装成一个弱引用当成Entry的key。Java的弱引用的定义是,当JVM执行垃圾回收扫描的时候,当发现只有弱引用的对象时,会立即回收此对象,这是ThreadLocal当初设计的时候防止内存溢出的一个手段

源码如下:

虽然key被包装成了一个弱引用会被垃圾回收机制给回收,但是value在线程(Thread)不死亡时却可能存在一条强引用链.

由于 value是强引用,只要 Thread不死亡时,例如线程池,这条强引用链就会存在,那么value就不会回收,可能造成内存溢出

引用关系如下: Thread ==> ThreadLocalMap ==> Entry ==> value

但是这个消除强引用链的动作是需要业务方在get的情况下触发的,可能业务方并不会get、也可能get是key不为空,并不会触发 expungeStaleEntry 类。所以开发者要养成良好的习惯,记得用完 ThreadLocal 时,调一次ThreadLocal.remove()方法或者 ThreadLocal.set(null)

正确的使用方式

public class ThreadLocalTest {    /**     * 未初始化的本地线程变量     */    private static ThreadLocal userThreadLocal = new ThreadLocal<>();    public static void main(String[] args) throws InterruptedException {        int threadNum = 10;        List threadList = Lists.newArrayList();        for (int i = 0; i < threadNum; ++i) {            long userId = i;            Thread t = new Thread(() -> {                try {                    // 设置变量值                    userThreadLocal.set(new User(userId, "lanxing" + userId, "2x"));                    // 使用变量                    doSomething();                } finally {                    // 移除变量                    userThreadLocal.remove();   //移除ThreadLocal变量                }            }, "T" + i);            threadList.add(t);            t.start();        }        for (int i = 0; i < threadNum; ++i) {            threadList.get(i).join();        }    }    private static void doSomething() {        log.info("Use ThreadLocal variable :{}", JSON.toJSONString(userThreadLocal.get()));    }}@Data@NoArgsConstructor@AllArgsConstructorclass User {    private Long id;    private String name;    private String level;}

打印结果:

14:30:26.790 [T2] INFO io.zhengsh.order.tool.ThreadLocalTest - Use ThreadLocal variable :{"id":2,"level":"2x","name":"lanxing2"}
14:30:26.789 [T5] INFO io.zhengsh.order.tool.ThreadLocalTest - Use ThreadLocal variable :{"id":5,"level":"2x","name":"lanxing5"}
14:30:26.792 [T0] INFO io.zhengsh.order.tool.ThreadLocalTest - Use ThreadLocal variable :{"id":0,"level":"2x","name":"lanxing0"}
14:30:26.792 [T4] INFO io.zhengsh.order.tool.ThreadLocalTest - Use ThreadLocal variable :{"id":4,"level":"2x","name":"lanxing4"}
14:30:26.792 [T8] INFO io.zhengsh.order.tool.ThreadLocalTest - Use ThreadLocal variable :{"id":8,"level":"2x","name":"lanxing8"}
14:30:26.791 [T1] INFO io.zhengsh.order.tool.ThreadLocalTest - Use ThreadLocal variable :{"id":1,"level":"2x","name":"lanxing1"}
14:30:26.792 [T7] INFO io.zhengsh.order.tool.ThreadLocalTest - Use ThreadLocal variable :{"id":7,"level":"2x","name":"lanxing7"}
14:30:26.792 [T6] INFO io.zhengsh.order.tool.ThreadLocalTest - Use ThreadLocal variable :{"id":6,"level":"2x","name":"lanxing6"}
14:30:26.791 [T9] INFO io.zhengsh.order.tool.ThreadLocalTest - Use ThreadLocal variable :{"id":9,"level":"2x","name":"lanxing9"}
14:30:26.790 [T3] INFO io.zhengsh.order.tool.ThreadLocalTest - Use ThreadLocal variable :{"id":3,"level":"2x","name":"lanxing3"}

"Java中ThreadLocal导致内存OOM的原因是什么"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

内存 原因 业务 变量 源码 线程 内容 垃圾 对象 情况 时候 更多 知识 被包 装成 存储 实用 良好 学有所成 接下来 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技巨头监管 互联网巨头科技公司 互联网与科技金融数据 深圳互联网络科技有限公司 宜安科技 互联网金融 上游互联网科技 深圳卡尔迅互联网科技有限公司怎么样 互联网科技创新企业排名 新华互联网科技2019 哈尔滨新华互联网科技学院 须眉科技是互联网公司吗 互联网科技寓意 重庆互联网医院沙龙医盟信息科技 锡山区互联网智能科技产品供应 2021世界互联网领先科技成果发布 互联网时代科技型公司的机会 上海万顺科技互联网有限公司招聘 保山互联网科技靠谱吗 保山浩联互联网科技有限公司 广州全民伙伴互联网科技有限公司 互联网公司 科技公司 互联网科技logo设计 成都玖崟互联网科技有限公司乐商圈怎么样 燊美集互联网科技有限公司 中国互联网公司排名锤子科技 佛山市拉法互联网科技有限公司 互联网科技如何创业 上海科技产业互联网平台 黑云互联网科技有限公司 浙南科技城互联网大厦招聘
0