虚引用的总结

在这里插入图片描述

这个是虚引用源码中的描述,大概意思如下:

  • 与软引用和弱引用不同,虚引用在进入队列时不会被垃圾收集器自动清除。通过虚引用可访问的对象将一直保持这种状态,直到所有此类引用被清除或其本身成为不可访问的。

解释如下:

1.虚引用的作用是用来跟踪它所引用的对象被垃圾收集器回收的活动。

2.和软,弱引用不同,它必须和引用队列联合使用,它是在对象被回收前就加入引用队列中的。

3.当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就把它对应的虚引用加入到与之关联的引用队列中。这样就可以通过判断引用队列中是否已经加入了虚引用, 
来了解被引用对象是否将要被垃圾回收器回收 ,可以做一些在回收前的必要行动,如ByteBuffer分配的直接内存的回收操作。
  • 虚引用的一个体现是释放直接内存所分配的内存,当引用的对象ByteBuffer被垃圾回收时,虚引用对象Cleaner就会被放入引用队列中,然后调用Cleaner的clean方法来释放直接内存。

  • 如上图,B对象不再引用ByteBuffer对象,ByteBuffer将要被回收。但是它分配的直接内存中的内存还未被回收。这时需要将虚引用对象Cleaner放入引用队列中,然后调用它的clean方法来释放直接内存。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 引用(PhantomReference)是Java中四种引用类型之一,用于在对象被垃圾收集器回收时收到通知。引用并不会影响对象的生命周期,而是在对象被回收时,引用对象将被加入一个与之关联的引用队列(ReferenceQueue)中,以便在对象被回收时进行处理。 下面是一个引用的使用示例,假设有一个需要手动清理的资源池,当对象从池中被移除时,可以将其包装成一个引用,然后在资源池的清理线程中监视引用队列,当引用对象出现在队列中时,说明该对象已经被垃圾收集器回收,可以将其相应的资源释放。 ```java public class ResourcePool { private Map<Object, PhantomReference<Object>> pool; private ReferenceQueue<Object> queue; public ResourcePool() { pool = new HashMap<>(); queue = new ReferenceQueue<>(); } public synchronized void addResource(Object resource) { PhantomReference<Object> ref = new PhantomReference<>(resource, queue); pool.put(resource, ref); } public synchronized void removeResource(Object resource) { pool.remove(resource); } public void cleanUp() { Reference<?> ref; while ((ref = queue.poll()) != null) { Object resource = ref.get(); if (resource != null) { // Do clean-up } } } } ``` 在上面的代码中,我们创建了一个ResourcePool类来管理资源,addResource方法用于将资源添加到池中,并将其包装成一个引用对象;removeResource方法用于从池中移除资源;cleanUp方法用于清理资源池中的引用对象,如果引用对象被加入到了队列中,说明对应的资源已经被垃圾收集器回收,可以在此时执行资源的清理操作。 需要注意的是,引用的get方法始终返回null,因此不能使用引用对象获取到被引用的对象,而是需要通过其他手段来获取被引用对象的引用,例如在创建引用对象时同时将被引用对象的引用保存下来。 ### 回答2: 引用(Phantom Reference)是Java中用于管理对象生命周期的一种特殊引用类型。它通常用在需要在对象被GC回收前进行一些清理操作的场景中,比如对象销毁时释放一些关联资源。 使用引用的案例之一是Java中的垃圾回收机制的管理。当一个对象被垃圾回收器标记为可以清理时,引用会被放入一个队列中,称为引用队列。通过检查引用队列,程序可以得知对象即将被销毁,从而执行一些相应的清理操作。 举个例子,假设我们有一个较大的对象,它占用了大量的内存资源。在这种情况下,我们可以使用引用来及时释放这些资源。首先,我们创建一个引用并关联到该对象上。然后,在对象即将被回收之前,垃圾回收器将把引用放入引用队列中。通过检查引用队列,我们可以得知对象即将被销毁,于是可以在销毁之前释放所占用的资源,比如关闭文件、释放网络连接等。 引用的使用案例也可以在一些缓存场景中找到。当一个对象被从缓存中移除时,我们可以使用引用来执行一些清理操作,比如将对象持久化到磁盘,以便下次需要时可以快速恢复。 总结来说,引用的使用案例是对垃圾回收过程的管理和对象销毁前的资源释放。通过引用,我们可以在对象被GC回收前进行一些必要的清理操作,从而提高程序的性能和资源利用效率。 ### 回答3: 引用(Phantom Reference)是Java中一种最弱的引用类型。它的主要作用是跟踪对象被垃圾回收的状态。引用并不能直接通过get()方法获取到引用对象,而是通过创建一个引用队列和引用一起使用。 使用引用的一个典型案例是在对象被回收时执行一些清理操作。当引用对象被垃圾回收器回收时,会将其放入引用队列中,这时可以通过判断引用队列中是否有引用对象从而执行相应的清理操作。比如可以在引用对象被回收时,关闭打开的文件、释放占用的资源等。 下面是一个使用引用的简单示例: ```java import java.lang.ref.PhantomReference; import java.lang.ref.Reference; import java.lang.ref.ReferenceQueue; public class PhantomReferenceExample { public static void main(String[] args) { Object obj = new Object(); ReferenceQueue<Object> queue = new ReferenceQueue<>(); PhantomReference<Object> phantomRef = new PhantomReference<>(obj, queue); // 在这里执行一些操作,比如打开文件 obj = null; // 解除强引用,使对象成为垃圾对象 // 检查引用队列,判断对象是否被回收 Reference<?> ref; while ((ref = queue.poll()) != null) { if (ref == phantomRef) { // 执行清理操作,比如关闭文件 // ... } } } } ``` 在上述示例中,创建了一个引用phantomRef引用了一个Object对象obj,并将其放入引用队列queue中。通过设置obj为null,解除对obj的强引用,使其成为垃圾对象。当垃圾收集器回收obj时,会自动将phantomRef放入引用队列中。通过检查引用队列,可以判断obj是否被回收,并在此时执行清理操作。 需要注意的是,引用并不会延长对象的生命周期,只是提供了一个通知的机制。因此,在使用引用时需要小心,避免出现对象在程序中仍然被引用的情况下被回收。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值