当前位置:网站首页 > Java基础 > 正文

java四种引用教程



 
  

通过将这个叫“引用”的标识符指向某个对象,之后便可以通过这个引用来实现操作对象了。

 
  
  • 引用计数法:为每个对象添加一个引用计数器,每当有一个引用指向它时,计数器就加1,当引用失效时,计数器就减1,当计数器为0时,则认为该对象可以被回收(目前在Java中已经弃用这种方式了)。
  • 可达性分析算法:从一个被称为 GC Roots 的对象开始向下搜索,如果一个对象到GC Roots没有任何引用链相连时,则说明此对象不可用。

JDK1.2 之前,一个对象只有“已被引用”和”未被引用”两种状态,这将无法描述某些特殊情况下的对象,比如,当内存充足时需要保留,而内存紧张时才需要被抛弃的一类对象。

所以在 JDK.1.2 之后,Java 对引用的概念进行了扩充,将引用分为了:强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)、虚引用(Phantom Reference)4 种,这 4 种引用的强度依次减弱。

Java中默认声明的就是强引用,比如:

 
  

只要强引用存在,垃圾回收器将永远不会回收被引用的对象,哪怕内存不足时,JVM也会直接抛出OutOfMemoryError,不会去回收。如果想中断强引用与对象之间的联系,可以显示的将强引用赋值为null,这样一来,JVM就可以适时的回收对象了

软引用是用来描述一些非必需但仍有用的对象。在内存足够的时候,软引用对象不会被回收,只有在内存不足时,系统则会回收软引用对象,如果回收了软引用对象之后仍然没有足够的内存,才会抛出内存溢出异常。这种特性常常被用来实现缓存技术,比如网页缓存,图片缓存等。
在 JDK1.2 之后,用java.lang.ref.SoftReference类来表示软引用。

首先先来测试一下强引用,在限制了 JVM 内存的前提下,下面的代码运行正常

 
  

但是如果我们将

 
  

替换为创建一个大小为 2M 的字节数组

 
  

接着来看一下软引用会有什么不一样,在下面的示例中连续创建了 10 个大小为 1M 的字节数组,并赋值给了软引用,然后循环遍历将这些对象打印出来。

 
  
 
  

如果一个对象惟一剩下的引用是软引用,那么该对象是软可及的(softly reachable)。垃圾收集器并不像其收集弱可及的对象一样尽量地收集软可及的对象,相反,它只在真正 “需要” 内存时才收集软可及的对象。

弱引用的引用强度比软引用要更弱一些,无论内存是否足够,只要 JVM 开始进行垃圾回收,那些被弱引用关联的对象都会被回收。在 JDK1.2 之后,用 java.lang.ref.WeakReference 来表示弱引用。
我们以与软引用同样的方式来测试一下弱引用:

 
  

可以发现所有被弱引用关联的对象都被垃圾回收了。

虚引用是最弱的一种引用关系,如果一个对象仅持有虚引用,那么它就和没有任何引用一样,它随时可能会被回收,在 JDK1.2 之后,用 PhantomReference 类来表示,通过查看这个类的源码,发现它只有一个构造函数和一个 get() 方法,而且它的 get() 方法仅仅是返回一个null,也就是说将永远无法通过虚引用来获取对象,虚引用必须要和 ReferenceQueue 引用队列一起使用。

 
  

那么传入它的构造方法中的 ReferenceQueue 又是如何使用的呢?

引用队列可以与软引用、弱引用以及虚引用一起配合使用,当垃圾回收器准备回收一个对象时,如果发现它还有引用,那么就会在回收对象之前,把这个引用加入到与之关联的引用队列中去。程序可以通过判断引用队列中是否已经加入了引用,来判断被引用的对象是否将要被垃圾回收,这样就可以在对象被回收之前采取一些必要的措施。

与软引用、弱引用不同,虚引用必须和引用队列一起使用。

六、软引用与弱引用的使用

弱引用的使用:

1、weakHashmap的key  源码分析:https://www.jianshu.com/p/c09e3

2、threadLocalMap的key 源码分析:https://www.cnblogs.com/liuyun1995/p/8144676.html

3、jdk动态代理中缓存代理类的weakCache https://www.cnblogs.com/liuyun1995/p/8144676.html

软引用的使用:

  • 软引用适合用作非必须大对象的缓存

  • 上一篇: java教程100
  • 下一篇: 大学用的java 教程视频
  • 版权声明


    相关文章:

  • java教程1002025-10-15 16:18:01
  • java网页项目教程2025-10-15 16:18:01
  • java教程62025-10-15 16:18:01
  • java gui idea教程2025-10-15 16:18:01
  • java编程教程txt2025-10-15 16:18:01
  • 大学用的java 教程视频2025-10-15 16:18:01
  • java代码画爱心教程2025-10-15 16:18:01
  • java线程安装教程2025-10-15 16:18:01
  • java教程哪家靠谱2025-10-15 16:18:01
  • java扩展教程2025-10-15 16:18:01