强引用、软引用、弱引用、虚引用

本文深入解析Java垃圾回收机制,包括对象死亡的两个阶段,以及四种引用类型的特性与应用场景:强引用、软引用、弱引用和虚引用。探讨了它们如何影响对象的生命周期,以及如何与引用队列配合使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

慕课网:键值Java面试-Offer直通车 第六章jvm知识
在这里插入图片描述
当垃圾回收器宣布一个对象死亡,至少需要经过两个阶段:
1.当对象进行可达性分析时发现没有和GC ROOTS相连接就会被第一次标记;
2.判断对象是否覆盖finalize(),如果覆盖,并且未被引用过这个方法的对象就会被放在F-Queue中,最后由JVM执行该方法。(JVM自动创建的低优先级finalize()线程,方法执行随时可能会终止)
finalize()函数是在JVM回收内存时执行的,但JVM并不保证在回收内存时一定会调用finalize()。

强引用、软引用、弱引用、虚引用

强引用

最普通的引用(如果一个对象具有强引用,那垃圾回收器绝不会回收它)
Object obj=new Object ();
当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题。

如果不使用时,可通过obj=null;// 帮助垃圾收集器回收此对象方式来弱化引用。
显式地设置obj为null,或超出对象的生命周期范围,则gc认为该对象不存在引用,这时就可以回收这个对象。
[示例:ArrayList的实现源代码 clear() ]

软引用

对象处在有用但非必需的状态
只有当内存空间不足时,GC会回收该引用的对象的内存
可用来实现高速缓存

String str=new String("abc");                                     // 强引用
SoftReference<String> softRef=new SoftReference<String>(str);     // 软引用

当内存不足时,等价于:

If(JVM.内存不足()) {
   str = null;  // 转换为软引用
   System.gc(); // 垃圾回收器进行回收
}

[示例:浏览器的后退按钮]

弱引用

非必需的对象,比软引用更弱一些
GC时,发现即被回收(不管当前内存空间足够与否
因GC线程优先级较低,所以不一定会很快被发现
适用于引用偶尔被使用(在使用时随时就能获取到)且不影响此对象的垃圾收集。

弱引用与软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程,因此不一定会很快发现那些只具有弱引用的对象。

String str=new String("abc");    
WeakReference<String> abcWeakRef = new WeakReference<String>(str);
str=null;

【应用:引用一个对象,但是这个对象有自己的生命周期,你不想介入这个对象的生命周期,这时候你就是用弱引用。】

虚引用

“虚引用”顾名思义,就是形同虚设,与其他几种引用都不同,虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收

跟踪对象被垃圾收集器回收的活动,起哨兵作用
必须 和引用队列ReferenceQueue联合使用(虚引用与软引用和弱引用的一个区别)

  String str="abc";//强引用
  ReferenceQueue queue=new ReferenceQueue();
 PhantomReference ref=new PhantomReference (str,queue);

在这里插入图片描述
软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收器回收,Java虚拟机就会把这个软引用加入到与之关联的引用队列中

弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被垃圾回收器回收,Java虚拟机就会把这个弱引用加入到与之关联的引用队列中

当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中

引用队列ReferenceQueue

1.无实际存储结构,存储逻辑依赖于内部结点之间的关系来表达(head,next);
2.存储关联的且要被GC的软/弱/虚引用

参考(讲解较详细,有示例):Java 的强引用、弱引用、软引用、虚引用
java引用总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值