jvm-强、软、弱、虚、终结器引用-细节到头发丝

目录

一、概述

二、引用类型

1. 强引用

a. 定义

b. 垃圾回收

2. 软引用

a. 定义

b. 使用场景

c. 垃圾回收

3. 弱引用

a. 定义

b. 使用场景

4. 虚引用

a. 定义

b. 使用场景

5. 终结器引用

a. 定义


一、概述

        Java中,引用分为强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)、虚引用(幽灵/幻影引用)(Phantom Reference)、终结器引用(Finalizer Reference)。每种引用类型对垃圾回收的影响不同,适用于不同的应用场景。

二、引用类型

1. 强引用
a. 定义

        一个直接引用指向一个对象。如:Object a = new Object();

b. 垃圾回收
  1. 局部变量

        因方法使用而创建,因方法结束而回收。

        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方法,在对象第二次被回收时,该对象才真正的被回收。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值