并发 · 单选题 · 第 19 题
Java 后端开发面试 · 第 19 题
ThreadLocal 使用不当可能造成内存泄漏,原因是?
- AThreadLocalMap 的键和值都是强引用,所以 ThreadLocal 对象本身永远都无法被垃圾回收掉
- BThreadLocal 的数据存放在所有线程共享的堆区里,任何线程都能读到别的线程存的值
- CThreadLocalMap 的键是弱引用、值是强引用;线程长期存活又不调用 remove,值就回收不了
- D线程结束之后它的 ThreadLocalMap 也不会被释放,只能等 JVM 进程退出时才会回收
答案
C C. ThreadLocalMap 的键是弱引用、值是强引用;线程长期存活又不调用 remove,值就回收不了
解析
ThreadLocal 对象没有外部引用后,作为弱引用的键会被回收变成 null,但值仍被线程的 ThreadLocalMap 强引用着。线程池里的线程一直存活,这些值就一直无法回收,还可能被下一个任务读到脏数据。规范写法是在 finally 里调用 remove。线程结束时整个 Map 会随线程一起回收。