Java的四种引用方式

简介: 1.强引用(StrongReference)2.软引用(SoftReference)3.弱引用(WeakReference)4.虚引用(PhantomReference)引用队列(ReferenceQueue)

1.强引用(StrongReference)


  • 使用最普遍的引用
  • 只要引用链没有断开,强引用就不会断开。- 当内存空间不足,抛出OutOfMemoryError终止程序也不会回收具有强引用的对象。
  • 通过将对象设置为null来弱化引用,使其被回收


1.Object object = new Object();
String str = "scc";
//都是强引用


2.软引用(SoftReference)


  • 对象处在有用但非必须的状态
  • 只有当内存空间不足时, GC会回收该引用的对象的内存。
  • 可以用来实现高速缓存(作用)--比如网页缓存、图片缓存


1.// 注意:wrf这个引用也是强引用,它是指向SoftReference这个对象的,
// 这里的软引用指的是指向new String("str")的引用,也就是SoftReference类中T
SoftReference<String> wrf = new SoftReference<String>(new String("str"));


3.弱引用(WeakReference)


       弱引用就是只要JVM垃圾回收器发现了它,就会将之回收。


  • 非必须的对象,比软引用更弱一-些
  • GC时会被回
  • 被回收的概率也不大,因为GC线程优先级比较低
  • 适用于引用偶尔被使用且不影响垃圾收集的对象 使用:


Map<Key, ResourceWeakReference> activeEngineResources = new HashMap<>();
//ResourceWeakReference弱引用


4.虚引用(PhantomReference)


  • 不会决定对象的生命周期


  • 任何时候都可能被垃圾收集器回收


  • 跟踪对象被垃圾收集器回收的活动,起哨兵作用


  • 必须和引用 队列 ReferenceQueue联合使用


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


       程序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收。如果程序发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动。


引用队列(ReferenceQueue)


  • 无实际存储结构,存储逻辑依赖于内部节点之间的关系来表达


  • 存储关联的且被GC的软引用,弱引用以及虚引用


引用 GC回收时机 使用示例
强引用 如果一个对象具有强引用,那垃圾收器绝不会回收它 Object object = new Object();
String str = "scc";
软引用 在内存实在不足时,会对软引用进行回收 SoftReference<Object> softObj=new softReference();
弱引用 第一次GC回收时,如果垃圾回收器遍历到此弱引用,则将其回收 WeakReference<Object> weakObj=new WeakReference();
虚引用 一个对象是否有虚引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用来获取一个对象的实例 不会使用


微信图片_20220520142752.png

相关文章
|
5月前
|
安全 Java
从零开始学习 Java:简单易懂的入门指南之不可变集合、方法引用(二十六)
从零开始学习 Java:简单易懂的入门指南之不可变集合、方法引用(二十六)
|
4月前
|
缓存 Java 数据库连接
java面试题目 强引用、软引用、弱引用、幻象引用有什么区别?具体使用场景是什么?
【6月更文挑战第28天】在 Java 中,理解和正确使用各种引用类型(强引用、软引用、弱引用、幻象引用)对有效的内存管理和垃圾回收至关重要。下面我们详细解读这些引用类型的区别及其具体使用场景。
49 3
|
3月前
|
Java 运维
开发与运维引用问题之软引用又在Java特点如何解决
开发与运维引用问题之软引用又在Java特点如何解决
35 0
|
4月前
|
Java
java方法引用::
java方法引用::
|
5月前
|
存储 Java
滚雪球学Java(41):Lambda表达式和方法引用:提高代码可读性和简洁性的神器
【5月更文挑战第16天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
46 2
滚雪球学Java(41):Lambda表达式和方法引用:提高代码可读性和简洁性的神器
|
5月前
|
存储 Java 索引
Java一维数组元素的引用与操作技术详解
Java一维数组元素的引用与操作技术详解
49 1
|
5月前
|
Java
【JAVA学习之路 | 进阶篇】方法引用与构造器引用
【JAVA学习之路 | 进阶篇】方法引用与构造器引用
|
5月前
|
存储 Java 索引
Java的数组定义与引用
Java的数组定义与引用
|
5月前
|
存储 Java 索引
Java二维数组的引用与操作技术详解
Java二维数组的引用与操作技术详解
58 0
|
5月前
|
缓存 Java
【JAVA】强引用、软引用、弱引用、幻象引用有什么区别?
幻象引用:幻象引用是最弱的引用类型,几乎不影响对象的生命周期。它们主要用于在对象被回收前进行某些预处理操作,例如在对象被销毁时执行特定的清理任务。
47 0
下一篇
无影云桌面