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<?>> { /** The value associated with this ThreadLocal. */ Object value; Entry(ThreadLocal<?> k, Object v) { super(k); value = v; } }
弱引用介绍:
如果一个对象只具有弱引用,那就类似于可有可无的生活用品。弱引用与软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它 所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程, 因此不一定会很快发现那些只具有弱引用的对象。
弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被垃圾回收,Java虚拟机就会把这个弱引用加入到与之关联的引用队列中。
-
那个操作不会造成内存泄露
2022-03-03 关注 0 浏览46 1答案
-
如何避免内存泄露
2021-11-28 关注 0 浏览105 1答案
-
JS 哪些操作会造成内存泄露?
2022-09-20 关注 0 浏览15 5答案
-
什么是js内存泄露?
2021-09-18 关注 0 浏览89 1答案
-
内存泄露是什么?如何避免?
2021-09-17 关注 0 浏览189 1答案
-
JS哪些操作会造成内存泄露
2021-12-06 关注 0 浏览121 1答案
-
JS哪些操作会造成内存泄露
2022-04-28 关注 0 浏览78 1答案
-
以下场景中不会导致内存泄露的是
2022-03-02 关注 0 浏览29 1答案
-
以下场景中不会导致内存泄露的是
2022-03-02 关注 0 浏览35 1答案
-
下面哪些程序片段确定有内存泄露或内存异常
2020-12-25 关注 0 浏览75 1答案