ThreadLocal 内存泄露问题?

ThreadLocal 内存泄露问题?,第1张

ThreadLocal 内存泄露问题?

ThreadLocalMap

中使用的 key 为
ThreadLocal
的弱引用,而 value 是强引用。所以,如果
ThreadLocal
没有被外部强引用的情况下,在垃圾回收的时候会 key 会被清理掉,而 value 不会被清理掉。这样一来,
ThreadLocalMap
中就会出现key为null的Entry。假如我们不做任何措施的话,value 永远无法被GC 回收,这个时候就可能会产生内存泄露。ThreadLocalMap实现中已经考虑了这种情况,在调用
set()
get()
remove()
方法的时候,会清理掉 key 为 null 的记录。使用完
ThreadLocal
方法后 最好手动调用
remove()`方法

      static class Entry extends WeakReference<ThreadLocal<?>> {  Object value; Entry(ThreadLocal<?> k, Object v) {     super(k);     value = v; }        }

弱引用介绍:

如果一个对象只具有弱引用,那就类似于可有可无的生活用品。弱引用与软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它 所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程, 因此不一定会很快发现那些只具有弱引用的对象。

弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被垃圾回收,Java虚拟机就会把这个弱引用加入到与之关联的引用队列中。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/4878599.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-11
下一篇 2022-11-11

发表评论

登录后才能评论

评论列表(0条)

保存