【jvm】强软弱虚引用的区别

1.说明
  • 1.在 Java 中,强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)和虚引用(Phantom Reference)是四种不同的引用类型,它们在内存管理和垃圾回收方面有着不同的行为。
2.强引用(Strong Reference)
2.1 定义
  • 1.最常见的引用类型,通常我们直接创建的对象引用就是强引用。
  • 2.只要某个对象存在强引用,垃圾回收器(GC)就不会回收该对象。
2.2 特点
  • 1.强引用指向的对象永远不会被垃圾回收,除非显式地将引用设置为 null,从而切断强引用。
  • 2.可能导致内存泄漏,如果强引用对象不再需要但未被释放。
2.3 示例
Object obj = new Object(); // obj 是强引用
2.4 应用场景
  • 1.常规对象引用,如局部变量、类成员变量等。
3.软引用(Soft Reference)
3.1 定义
  • 1.软引用用于描述一些还有用但并非必须的对象。
  • 2.对于只有软引用的对象,在系统将要发生内存溢出异常之前,会把这些对象列入回收范围进行二次回收。
3.2 特点
  • 1.如果内存足够,软引用对象不会被回收。
  • 2.如果内存不足,软引用对象会被回收。
  • 3.适用于缓存场景,如图片缓存、网页缓存等。
3.3 示例
SoftReference<Object> softRef = new SoftReference<>(new Object());
3.4 应用场景
  • 1.实现内存敏感的缓存,当内存不足时自动释放缓存对象。
4.弱引用(Weak Reference)
4.1 定义
  • 1.弱引用也是用来描述非必须对象的,但它的强度比软引用更弱。
  • 2.被弱引用关联的对象只能存活到下一次垃圾回收之前,当垃圾回收器工作时,无论内存是否充足,都会回收掉只被弱引用关联的对象。
4.2 特点
  • 1.弱引用不会阻止对象被垃圾回收。
  • 2.常用于实现规范映射(Canonicalizing Mappings),如 WeakHashMap。
4.3 示例
WeakReference<Object> weakRef = new WeakReference<>(new Object());
4.4 应用场景
  • 1.WeakHashMap,用于存储元数据,避免内存泄漏。
  • 2.监听器或其他辅助对象的引用,防止对象被长期持有。
5.虚引用(Phantom Reference)
5.1 定义
  • 1.虚引用是最弱的一种引用关系,为一个对象设置虚引用关联的唯一用处,就是在这个对象被收集器回收时收到一个系统通知。
  • 2.虚引用必须与引用队列(ReferenceQueue)联合使用。
5.2 特点
  • 1.虚引用不会决定对象的生命周期。
  • 2.无法通过虚引用获取对象实例。
  • 3.主要用于跟踪对象被垃圾回收的活动,实现清理操作。
5.3 示例
PhantomReference<Object> phantomRef = new PhantomReference<>(new Object(), new ReferenceQueue<>());
5.4 应用场景
  • 1.对象被回收时的清理操作,如释放非 Java 资源(文件句柄、网络连接等)。
  • 2.监控对象的垃圾回收过程,进行统计或调试。
6.对比总结
引用类型GC 时行为应用场景是否可获取对象
强引用永远不会被回收,除非显式设置为 null常规对象引用,如局部变量、类成员变量。
软引用内存不足时被回收。内存敏感的缓存,如图片缓存、网页缓存。
弱引用垃圾回收时立即被回收,无论内存是否充足。WeakHashMap,监听器,防止内存泄漏。
虚引用无法通过引用获取对象,仅用于跟踪对象被回收的活动。对象被回收时的清理操作,监控对象的垃圾回收过程。
7.类比说明
  • 1.强引用:就像一个人紧紧抓住一个物品,只要他不放手,别人就无法拿走。
  • 2.软引用:就像一个人拿着一个物品,但如果他需要腾出空间,他可能会放下这个物品。
  • 3.弱引用:就像一个人只是轻轻搭在一个物品上,一旦有人需要清理,这个物品就会被拿走。
  • 4.虚引用:就像一个人被告知某个物品将被拿走,但他无法阻止,只能在物品被拿走后得到通知。
8.注意事项
  • 1.内存泄漏:
    强引用可能导致内存泄漏,如果对象不再需要但未释放。
    弱引用和软引用可以帮助避免内存泄漏。

  • 2.引用队列:
    虚引用必须与引用队列一起使用,以便在对象被回收时得到通知。

  • 3.性能影响:
    使用弱引用、软引用和虚引用可能会增加程序的复杂性,需要权衡性能和功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王佑辉

老板,赏点吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值