java基础总结(面试高频问题)九:java的引用类型

1:java的四种引用类型:强引用,软引用,弱引用,虚引用;其强度排序为:强引用>软引用>弱引用>虚引用;
(1)强引用(Strong Reference):
即使进行了多次的GC回收,即使JVM真的已经不够用了,即使JVM最终不得已抛出了OOM错误,只要引用存在就不会被回收;

在这里插入图片描述

这个流程就是强引用,在System.gc()被调用时,只要oa没有断开连接,也就是oa没有被赋值为null,oa和ob都不会被回收;当oa=null之后,oa就断开了连接,就可以被当做垃圾回收;强引用只有全部的对象都断开连接之后,才可能称为垃圾空间,才有可能被回收。
注意:除了强引用,其它引用必须借助特殊类来完成。

(2)软引用(Soft Reference):当内存空间不足时,会回收此内存空间。如果充足则不回收。可以用其完成缓存的一些处理操作开发。 这样做的好处是保证java抛出OOM异常前,把软引用对象置为null;
缓存:保证数据更快的操作(读取)。是不重要的数据。可以作为牺牲来释放空间。
如果要想使用软引用必须单独使用特殊的处理类: java.lang.ref.SoftReference
在软引用之中如果想要进行引用的处理操作,则可以使用如下的方法完成:
<1>构造方法:public SoftReference(T reference);
<2>取得引用的数据:public T get();

在这里插入图片描述

输出:因为此时内存空间充裕,不会进行回收

在这里插入图片描述

(3)弱引用(Weak Reference):不管内存是否紧张,只要出现GC,则立即回收;
弱引用使用“WeakReference”类来完成:java.lang.ref.WeakReference

在这里插入图片描述

输出:

在这里插入图片描述

如果不断开强引用的连接:

在这里插入图片描述

输出:

在这里插入图片描述

注意这里的str是强引用,ref才是弱引用,所以如果不断开str强引用的连接,弱引用ref也不会释放:

(4)虚引用(Phantom Reference):和没有引用是一样的。 用的较少,使用虚引用后通过get方法获取的返回值始终为null,且虚引用必须与引用队列一起使用;
比如HashMap根据key取得值,设置key值为null和不设置key值的效果是一样的。
虚引用的处理类java.lang.ref.PhantomReference:

在这里插入图片描述

直接就把要保存的内容保存在了引用队列之中,需要发生引用但是又不需要引用占用空间的时候,使用虚引用;

2:引用队列:
引用队列里面保存的就是一个要准备被回收的对象的信息;
引用队列可以与软引用、弱引用以及虚引用一起配合使用,当垃圾回收器准备回收一个对象时,如果发现它还有引用,那么就会在回收对象之前,把这个引用加入到与之关联的引用队列中去。程序可以通过判断引用队列中是否已经加入了引用,来判断被引用的对象是否将要被垃圾回收,这样就可以在对象被回收之前采取一些必要的措施。
与软引用、弱引用不同,虚引用必须和引用队列一起使用。
例子详解:
(1)创建引用队列以及弱引用对象,将弱引用对象关联到引用队列中,执行发现引用队列queue中的值为null,此时不存在要被回收的对象的信息;

在这里插入图片描述

输出:

在这里插入图片描述

(2)断开强引用str后,调用GC,再次运行会看到引用队列queue中有内容;

在这里插入图片描述

输出:isEnqueued()方法返回是否在队列中,可以看到GC后返回为true

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值