【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进行垃圾回收时总会被回收。
本文来自博客园,作者:汪兔斯瑞佛,转载请注明原文链接:https://www.cnblogs.com/andywangit/p/15963039.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)