欢迎光临散文网 会员登陆 & 注册

Java 强软弱虚引用

2022-03-10 20:16 作者:房顶上的铝皮水塔  | 我要投稿

本文参考内容:

  1.  参考内容

  2. https://www.51cto.com/article/686209.html

本文分成以下几个部分:

  1. 介绍强软弱虚四种引用

  2. 为什么在ThreadLocal中使用的是WeakReference

  3. ThreadLocal中出现的内存泄露的问题

强引用

强引用不用多说,我们主要写的代码都是强引用:

句柄a放在虚拟机栈上,new创建出来的A放在堆中。设置a = null就会使得在堆中的A没有被引用到,这样就会被gc。

软引用

软引用会在内存不足时被释放:

设置内存为20M,输出为:

当创建第二个内存为10M的byte数组时,内存不够,就会回收软引用。

弱引用

弱引用会在gc的时候直接被释放,不管有无空闲的内存:

第二个输出为空

虚引用

通过虚引用的get方法只能返回null,而且虚引用必须要和Reference队列联合使用。它主要是实现一个对象回收的监听过程。

ThreadLocal部分源码分析

ThreadLocal是基于一个类似于Map的结构实现的保证线程数据的独立性:

ThreadLocalMap是基于Entry的结构:

Entry是一个WeakReference,同时在Entry的构造方法中也将ThreadLocal套了一层弱引用。

所以在栈区,tl句柄强引用指向对重的ThreadLocal,同时栈区的Key也通过弱引用的方式指向Threadlocal。这样我们不想使用ThreadLocal时,tl= null,然后gc就可以清除掉ThreadLocal。但是此时,Value对象还有强引用指向,所以Value对象可能会造成泄漏,只能等到线程结束。

总而言之,如果所示:


Java 强软弱虚引用的评论 (共 条)

分享到微博请遵守国家法律