目录
一、概述
Java中,引用分为强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)、虚引用(幽灵/幻影引用)(Phantom Reference)、终结器引用(Finalizer Reference)。每种引用类型对垃圾回收的影响不同,适用于不同的应用场景。
二、引用类型
1. 强引用
a. 定义
一个直接引用指向一个对象。如:Object a = new Object();
b. 垃圾回收
- 局部变量
因方法使用而创建,因方法结束而回收。

2.实例变量
随所属对象实例的回收而回收。


3.静态变量
非final修饰的静态变量,可以手动置空回收。final修饰的静态变量,只有当类加载器被回收才可能被回收。


2. 软引用
a. 定义
比强引用更弱一点的引用,当内存不足时,将会被回收。
b. 使用场景
缓存(如Caffeine)
c. 垃圾回收
设置堆内存为1个g,循环加入大小为100m的元素,当内存不够时,将触发gc,回收部分软引用。



3. 弱引用
a. 定义
更弱一些的引用,在垃圾回收时,不管内存够不够用,都会被回收。
b. 使用场景
ThreadLocal类。每个线程对象中的都有一个ThreadLocalMap, ThreadLocalMap中有一个Entry数组,而类Entry类使用了弱引用。

4. 虚引用
a. 定义
当虚引用对象被回收时,可以收到对应的通知。不能通过虚引用获取包含的对象。


b. 使用场景
Mysql驱动(mysql-connector-java)中使用了虚引用,用于关闭网络连接。
mysql-connector-java较高的版本(如8.0.29)中,AbandonedConnectionCleanupThread类使用了虚引用。早一点的版本(如5.1.38),NonRegisteringDriver类使用了虚引用。

![]()
在AbandonedConnectionCleanupThread的run方法中,调用finalizeResource方法去释放网络连接。


5. 终结器引用
a. 定义
在对象需要被回收时,终结器引用会将对象放在Finalizer类的引用队列中,稍后由一条由FinalizerThread线程从队列中获取对象,然后执行对象的finalize方法,在对象第二次被回收时,该对象才真正的被回收。



643

被折叠的 条评论
为什么被折叠?



