强引用,软引用,弱引用,虚引用

2024-05-21 15:33:35 浏览数 (2)

强引用,软引用,弱引用,虚引用

⽆论是通过引⽤计数法判断对象引⽤数量,还是通过可达性分析法判断对象的引⽤链是否可达,判定对象的存活都与“引⽤”有关。

JDK1.2之前,Java中引⽤的定义很传统:如果reference类型的数据存储的数值代表的是另⼀块内存的起始地址,就称这块内存代表⼀个引⽤。

JDK1.2以后,Java对引⽤的概念进行了扩充,将引⽤分为强引⽤、软引⽤、弱引⽤、虚引⽤四种(引⽤强度逐渐减弱)

  1. 强引用(StrongReference)
    • 以前我们使⽤的⼤部分引⽤实际上都是强引⽤,这是使⽤最普遍的引⽤。
    • 如果⼀个对象具有强引⽤,那就类似于必不可少的⽣活⽤品,垃圾回收器绝不会回收它。
    • 当内存空间不⾜,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终⽌,也不会靠随意回收具有强引⽤的对象来解决内存不⾜问题。
  2. 软引用(SoftReference)
    • 如果⼀个对象只具有软引⽤,那就类似于可有可无的⽣活⽤品。
    • 如果内存空间⾜够,垃圾回收器就不会回收它,如果内存空间不足了,就会回收这些对象的内存。
    • 只要垃圾回收器没有回收它,该对象就可以被程序使用。
    • 软引用可用来实现内存敏感的高速缓存
    • 软引⽤可以和⼀个引⽤队列(ReferenceQueue)联合使⽤,如果软引⽤所引⽤的对象被垃圾回收,JAVA虚拟机就会把这个软引用加入到与之关联的引⽤队列中。
  3. 弱引用(WeakReference)
    • 如果⼀个对象只具有弱引⽤,那就类似于可有可无的⽣活⽤品。
    • 弱引⽤与软引⽤的区别在于:
      • 只具有弱引⽤的对象拥有更短暂的⽣命周期。
    • 在垃圾回收器线程扫描它所管辖的内存区域的过程中,⼀旦发现了只具有弱引⽤的对象,不管当前内存空间⾜够与否,都会回收它的内存。
    • 不过,由于垃圾回收器是⼀个优先级很低的线程, 因此不⼀定会很快发现那些只具有弱引⽤的对象。
    • 弱引⽤可以和⼀个引⽤队列(ReferenceQueue)联合使⽤,如果弱引⽤所引⽤的对象被垃圾回收,Java虚拟机就会把这个弱引⽤加⼊到与之关联的引⽤队列中。
  4. 虚引用(PhantomReference)
    • "虚引⽤"顾名思义,就是形同虚设,与其他几种引⽤都不同,虚引⽤并不会决定对象的生命周期
    • 如果一个对象仅持有虚引⽤,那么它就和没有任何引⽤⼀样,在任何时候都可能被垃圾回收。
    • 虚引用主要用来跟踪对象被垃圾回收的活动。
    • 虚引⽤与软引⽤和弱引⽤的⼀个区别在于:
      • 虚引⽤必须和引⽤队列(ReferenceQueue)联合使用。
    • 当垃圾回收器准备回收⼀个对象时,如果发现它还有虚引⽤,就会在回收对象的内存之前,把这个虚引⽤加⼊到与之关联的引⽤队列中。
    • 程序可以通过判断引⽤队列中是否已经加⼊了虚引⽤,来了解被引⽤的对象是否将要被垃圾回收。
    • 程序如果发现某个虚引⽤已经被加⼊到引⽤队列,那么就可以在所引⽤的对象的内存被回收之前采取必要的⾏动。

特别注意,在程序设计中⼀般很少使⽤弱引⽤与虚引⽤,使⽤软引⽤的情况较多,这是因为软引⽤可以加速JVM对垃圾内存的回收速度,可以维护系统的运⾏安全,防⽌内存溢出(OutOfMemory)等问题的产⽣。

0 人点赞