Java面试题(十五)引用类型

本文详细介绍了Java中的四种引用类型:强引用、软引用、弱引用和虚引用的特点及应用场景。通过示例代码解释了每种引用类型的工作原理,并探讨了它们如何影响垃圾回收机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

强引用

就是new出来的这个对象指向一个内存地址,这个内存地址如果一直被指针指向的话是不会被GC的,这可能会造成内存溢出OOM

User user = new User();

//只有当user设置为null 时,内存才会被垃圾回收掉
user = null;

软引用

软引用是用SoftReference来创建的对象称之为软引用,
例如现在给堆内存设置一个20M 的空间大小
先创建一个占用10M大小的软引用对象
然后再创建一个15M大小的数组对象
此时内容空间只有20M是明显不够的,这是JVM会GC一次,如果还是不够用,就会把软引用所占用的内存空间回收掉

//假设这里创建一个sr对象,他的byte占用大小是10M
SoftReference<byte[]> sr = new SoftReference<>(new byte[1024*1024*10]);

//如果此时再创建一个15M的数组对象,那么很明显,空间就不够用了,这是GC一次,如果还是不够用,就把软引用所占用的内存空间回收掉
byte[] b = new byte[1024*1024*15];

弱引用

弱引用的特点是只要JVM GC的时候都会被回收,所以这个一般很少会用到

User user = new User();
WeakReference sf = new WeakReference(user );

虚引用

就是一个虚拟出来的对象,调用对象的get方法是无效的

虚引用的作业实际上是跟踪GC过程。

当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在垃圾回收后,销毁这个对象,将这个虚引用加入引用队列。程序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收。如果程序发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动

User user = new User();
ReferenceQueue<Object> referenceQueue = new ReferenceQueue<>();
PhantomReference sf = new PhantomReference<>(user,referenceQueue);

//获取到的是null
sf.get();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

珍妮玛•黛金

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值