2 个回答
我们使用 ThreadLocal 时,存在几个关键引用和对象,ThreadLocal 引用和其引用的 ThreadLocal 对象,ThreadLocal 的 ThreadLocalMap 下的 Entry 的 key 的引用和 value 的引用,其中 key 的引用是引用了 ThreadLocal 对象, value 引用了对应的值,当我们的 Entry 不再被使用时,由于 ThreadLocalMap 对象是 Thread 的一个全局变量,所以其生命周期和 Thread 一样长,因此 ThreadLocalMap 下的 Entry[] 数组下的 Entry 元素就无法被垃圾回收,存在 Thread -> ThreadLocalMap -> Entry[] -> Entry 的一个引用链条,根本原因在于我们在使用完 ThreadLocal 后没有删除 Entry 元素,当我们将 key 设计为弱引用后,key 可以被垃圾回收不会造成内存泄漏,但是 value 依然会造成内存泄漏。
发布于:3个月前 (02-08) IP属地:四川省
ThreadLocal出现内存泄漏主要是因为:
如下图:

ThreadLocalMap 中使用的 key 为 ThreadLocal 的弱引用,value 是强引用。当 ThreadLocal 没有被外
部强引用的情况下,在垃圾回收的时候,key 会被清理掉,而 value 不会被清理掉,从而导致内存溢
出
如下图:

发布于:1年前 (2024-04-09) IP属地:澳大利亚
我来回答
您需要 登录 后回答此问题!