page contents

ThreadLocal内存泄漏问题

Pack 发布于 2020-02-12 18:37
阅读 427
收藏 0

attachments-2020-02-cy2iRZmh5e43d54ea30d5.png
Tom老师,您好,想问一下为什么线程池里面不调用remove()方法为什么会导致内存泄漏,谢谢!!!

341
Pack
Pack

ThreadLocal本身并不存储值,它为每一个线程维护了一个ThreadLocalMap,该map的键是弱引用指向的ThreadLocal对象,而value则是强引用指向实际存储的值,当GC时,若键对应的ThreadLocal对象没有强引用指向就会被回收,但是value不会被回收,因为value隐含了当前线程指向的强引用,也就造成了内存泄露,当数据存储较多时就会导致OOM,为此,ThreadLocal在设计时就加上了防范措施,调用get()/set()/remove()方法都会清除掉key为null的value。

请先 登录 后评论