Java四大引用类型

从Java12版本开始,对象的引用细分为强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)和虚引用(Phantom Reference)四种级别

GC回收的优先级上:  强引用->软引用->弱引用->虚引用。

 

1. 引用的四种类型

1. 强引用(Strong Reference)

Student student=new Student();
WeakReference wr=new WeakReference(student);

在代码中普遍使用的,类似Student student =new Student();的就是强引用,如果一个对象具有强引用,则无论在什么情况下,GC都不会回收被引用的对象。当内存空间不足时,JAVA虚拟机宁可抛出OutOfMemoryError终止应用程序也不会回收具有强引用的对象。

2. 软引用(Soft Reference)

表示一个对象处在有用但非必须的状态。如果一个对象具有软引用,在内存空间充足时,GC就不会回收该对象;当内存空间不足时,GC会回收该对象的内存(回收发生在OutOfMemoryError之前)。 看下面的代码所示,我们声明软引用的方式是new 一个SoftReference对象,这个SoftReference是官方提供的,我们直接使用就行

Student student =new Student ();
SoftReference sr=new SoftReference(student);

当然了,我们也可以在new SoftReference对象的时候传入一个ReferenceQueue  ,  软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被GC回收,Java虚拟机就会把这个软引用加入到与之关联的引用队列中,我们就可以通过查看这个ReferenceQueue里存储的信息来知道哪些软引用对象被回收了


3. 弱引用(Weak Reference)

用来描述非必须的对象。它类似软引用,但是强度比软引用更弱一些:弱引用具有更短的生命.GC在扫描的过程中,一旦发现只具有被弱引用关联的对象,都会回收掉被弱引用关联的对象。换言之,无论当前内存是否紧缺,GC都将回收被弱引用关联的对象。(只要发生GC,则回收弱引用对象

看下面的代码所示,我们声明弱引用的方式是new 一个WeakReference对象,这个WeakReference是官方提供的,我们直接使用就行

Student student =new Student ();
WeakReference wr=new WeakReference(student);

同样的,我们也可以在new WeakReference对象的时候传入一个ReferenceQueue  ,  弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被GC回收,Java虚拟机就会把这个弱引用加入到与之关联的引用队列中,我们就可以通过查看这个ReferenceQueue里存储的信息来知道哪些弱引用对象被回收了

4. 虚引用(Phantom Reference)

虚引等同于没有引用,这意味着在任何时候都可能被GC回收,设置虚引用的目的是为了被虚引用关联的对象在被垃圾回收器回收时,能够收到一个系统通知。(被用来跟踪对象被GC回收的活动)虚引用和弱引用的区别在于:虚引用在使用时必须和引用队列(ReferenceQueue)联合使用,其在GC回收期间的活动如下:

看下面的代码所示,我们声明虚引用的方式是new 一个PhantomReference对象,这个PhantomReference是官方提供的,我们直接使用就行

ReferenceQueue queue=new ReferenceQueue();
PhantomReference pr=new PhantomReference(queue);

也即是GC在回收一个对象时,如果发现该对象具有虚引用,那么在回收之前会首先该对象的虚引用加入到与之关联的引用队列中。程序可以通过判断引用队列中是否已经加入虚引用来了解被引用的对象是否被GC回收。       

 

最近打算重拾我的公众号啦,接下来的日子里我会好好维护公众号的,公众号的内容覆盖面会比较全面,Java技术知识、设计模式,计算机网络,数据结构和算法、操作系统、计算机组成原理。 所以啊,不管是不是考研党,我都先建议关注一下,一起加油,奥利给!!!

 

 

 

 

 

posted @ 2020-12-21 15:09  抬头不见星空  阅读(133)  评论(0)    收藏  举报