Java中强、软、弱、虚四种引用详解

简介: Java中强、软、弱、虚四种引用详解
  1. 强引用
      强引用就是指在程序代码之中普遍存在的,指创建一个对象并把这个对象赋给一个引用变量,并没有像其它三种引用一样有一个就具体的类来描述。对于强引用对象,即使内存不足,JVM宁愿抛出OutOfMemoryError (OOM)错误也不会回收这种对象。

例如:

Object object =new Object(); String str ="hello";
  如果想中断强引用和某个对象之间的关联,可以显示地将引用赋值为null,这样一来的话,JVM在合适的时间就会回收该对象。比如各种集合的移除方法。

  1. 软引用
    SoftReference< People > aSoftRef=new SoftReference< People >(obj)

  软引用是用来描述一些还有用但并非必需的对象。只使用SoftReference类修饰的对象就是一个软引用对象(软可到达对象),如果一个对象只具有软引用,内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。
  常常用于缓存操作,把某个对象标记为软引用时,当内存足够就不会回收,内存不足就会回收,比如网页缓存,图片缓存等。并且软引用都会保证在虚拟机抛出OutOfMemoryError之前已经被清除。

  1. 弱引用
    WeakReference< People > reference=new WeakReference< People >(obj);

  弱引用也是用来描述非必需对象的。只使用WeakReference类修饰的对象就是一个弱引用对象(弱可达对象)。弱引用的对象相比软引用拥有更短暂的生命周期。无论内存是否足够,一旦下次垃圾回收器运行后扫描到弱引用,便会回收。 不过,由于垃圾回收器是一个优先级很低的线程,因此不一定会很快发现那些只具有弱引用的对象。
  Java中有WeakHashMap类,以及THreadLocal中的ThreadLocalMap内部节点Entry,他们都是WeakReference的实现。

  1. 虚引用
    PhantomReference< People > pr = new PhantomReference< People > (object, ReferenceQueue);

  虚引用也称为幽灵引用或者幻影引用,它是最弱的一种引用关系,虚引用与软引用和弱引用的一个区别在于:虚引用必须和引用队列 (ReferenceQueue)联合使用。
  无法通过get获取该引用,但其实虚引用其实是持有对象引用的,只是PhantomReference的get方法的实现永远返回null。
  先要纠正一种观点,一个对象被关联成虚引用,是完全有可能影响其生命周期的,虚引用有潜在的内存泄露风险,因为JVM不会自动帮助我们释放,我们必须要保证它指向的堆对象是不可达的。
  一个对象设置虚引用关联的唯一目的就是能在这个对象被收集器回收时会被加入到相关引用队列中,常常被用于管理堆外内存的清理,DirectByteBuffer等能够申请堆外内存的对象均与一个虚引用相关联,当DirectByteBuffer对象被回收时,会被加入到一个引用队列,此时GC会判断队列中的对象,并且对DirectByteBuffer对象申请的堆外内存进行清理。

本文来源于:奈学开发者社区,如有侵权请联系我删除~

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