ThreadLocalMap 的 Entry 继承了 WeakRefrence<ThreadLocal>。
为什么这样子?
有人说是为了防止内存泄漏,但是没有给出怎样情况下会发生内存泄漏。
有木有大神可以详细分析一下WeakRefrence的作用,还有Entry为什么要继承WeakRefrence。
继承一个WeakRefrence 又是什么个意思?
ThreadLocalMap 的 Entry 继承了 WeakRefrence<ThreadLocal>。
为什么这样子?
有人说是为了防止内存泄漏,但是没有给出怎样情况下会发生内存泄漏。
有木有大神可以详细分析一下WeakRefrence的作用,还有Entry为什么要继承WeakRefrence。
继承一个WeakRefrence 又是什么个意思?
看一个例子
for (int i = 0; i < 10; i++) {
byte[] buff = new byte[1024 * 1024];
WeakReference<byte[]> sr = new WeakReference<>(buff);
list.add(sr);
}
System.gc(); //主动通知垃圾回收
for(int i=0; i < list.size(); i++){
Object obj = ((WeakReference) list.get(i)).get();
System.out.println(obj);
}
}
这里的list持有WeakReference,接下来还会get,也就是还会使用,还是被全部回收了。
再来看一个例子
List<WeakReference<byte[]>> list=new ArrayList<>();
List<byte[]> list1=new ArrayList<>();
for (int i = 0; i < 10; i++) {
byte[] buff = new byte[1024 * 1024];
//也就是说回收了WeakReference的部分
list1.add(buff);
WeakReference<byte[]> sr = new WeakReference<>(buff);
list.add(sr);
}
System.gc(); //主动通知垃圾回收
for(int i=0; i < list.size(); i++){
Object obj = ((WeakReference) list.get(i)).get();
System.out.println(obj);
}
这次的没有被回收,也就说,我们的threadlocal强引用还在的时候,不会被回收,但是当threadlocal使用完了以后,就只剩下Entry对象的引用,这种场景就很适合用弱引用
3 回答2.6k 阅读✓ 已解决
3 回答4.1k 阅读✓ 已解决
8 回答3.6k 阅读
4 回答2.8k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
3 回答2.5k 阅读✓ 已解决
3 回答1.7k 阅读✓ 已解决
ThreadLocal
是为线程中的对象服务的。ThreadLocalMap
中保存的是当前线程中的ThreadLocal
对象所引用的其他对象。当
ThreadLocal
对象不再使用的时候,最好把它从ThreadLocalMap
中的Entry
对象中删掉,以免引起内存泄露。WeakRefrence
正好适合这种场景。比如有下面这个对象:
当
Foo
对象中的tl
不再使用的时候,应该让垃圾回收器把tl
回收掉。但是如果不使用WeakRefrence
,那么当前线程上的ThreadLocalMap
中就会有一个Entry
引用着tl
对象,导致垃圾回收器无法回收tl
,除非线程结束,这样就存在内存泄露的风险。将实体中的
ThreadLocal
对象通过WeakRefrence
来引用,当tl
对象不再使用的时候,WeakRefrence
中的引用会自动断开,这样就不会阻止垃圾回收了。