【Java 引用方式】对象的4种引用方式

概念

强引用,软引用,弱引用,虚引用

分类

2.1强引用

是指创建一个对象并把这个对象赋给一个引用变量。

Object object =new Object();
String str ="hello";

只要对象和强引用还有关联JVM就不会回收这个强引用的对象
例子:
Object obj=new Object(),obj作为强引用存在虚拟机栈中,而new Object()作为对象存在于堆中,当obj的作用域结束,对应的虚拟机栈消失,obj引用也同时消失,但new Object()对象却仍然存在于堆中。
obj强引用消失后,new Object()和它的关联也就断了,这样就不再和GC Roots相连接,gc在之后的某个时间就会回收这个对象了。

2.2软引用(SoftReference)

在Java中用java.lang.ref.SoftReference类来表示
只有在内存不足的时候JVM才会回收该对象

MyObject aRef = new  MyObject();
SoftReference aSoftRef=new SoftReference(aRef);

对于这个MyObject对象,有两个引用路径,一个是来自SoftReference对象的软引用,一个来自变量aReference的强引用,所以这个MyObject对象是强可及对象
随即,我们可以结束aReference对这个MyObject实例的强引用:
aRef = null;
个MyObject对象成为了软可及对象。如果垃圾收集线程进行内存垃圾收集,并不会因为有一个SoftReference对该对象的引用而始终保留该对象。

2.3弱引用(WeakReference)

当JVM进行垃圾回收时,无论内存是否充足,都会回收被弱引用关联的对象
在java中,用java.lang.ref.WeakReference类来表示

WeakReference<String> sr = new WeakReference<String>(new String("hello"));

当一个对象仅仅被weak reference指向, 而没有任何其他strong reference指向的时候, 如果GC运行, 那么这个对象就会被回收

2.4虚引用(PhantomReference)

虚引用和前面的软引用、弱引用不同,它并不影响对象的生命周期。在java中用java.lang.ref.PhantomReference类表示。如果一个对象与虚引用关联,则跟没有引用与之关联一样,在任何时候都可能被垃圾回收器回收。
要注意的是,虚引用必须和引用队列关联使用

ReferenceQueue<String> queue = new ReferenceQueue<String>();  
PhantomReference<String> pr = new PhantomReference<String>(new String("hello"), queue);

2.5 引用队列 ReferenceQueue

对于软引用和弱引用,我们希望当一个对象被gc掉的时候通知用户线程,进行额外的处理时,就需要使用引用队列了。ReferenceQueue即这样的一个对象,当一个obj被gc掉之后,其相应的包装类,即ref对象会被放入queue中。

总结

对于强引用,我们平时在编写代码时经常会用到。而对于其他三种类型的引用,使用得最多的就是软引用和弱引用,这2种既有相似之处又有区别。它们都是用来描述非必需对象的,但是被软引用关联的对象只有在内存不足时才会被回收,而被弱引用关联的对象在JVM进行垃圾回收时总会被回收。

posted @   汪兔斯瑞佛  阅读(437)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示