垃圾回收中对象的五种可达性——强、软、弱、虚、不可达

在javaAPI文档
https://docs.oracle.com/javase/8/docs/api/java/lang/ref/package-summary.html
中介绍了Java.lang.ref,它提供了与 Java 垃圾回收器密切相关的引用类。
并且介绍了对象的可达性。

Reachability

Going from strongest to weakest, the different levels of reachability reflect the life cycle of an object. They are operationally defined as follows:

  • An object is strongly reachable if it can be reached by some thread without traversing any reference objects. A newly-created object is strongly reachable by the thread that created it.
  • An object is softly reachable if it is not strongly reachable but can be reached by traversing a soft reference.
  • An object is weakly reachable if it is neither strongly nor softly reachable but can be reached by traversing a weak reference. When the weak references to a weakly-reachable object are cleared, the object becomes eligible for finalization.
  • An object is phantom reachable if it is neither strongly, softly, nor weakly reachable, it has been finalized, and some phantom reference refers to it.
  • Finally, an object is unreachable, and therefore eligible for reclamation, when it is not reachable in any of the above ways.

可达性
从强到弱,不同级别的可达性反应对象的生命周期,定义如下:

  • 如果一个对象可以被一些线程直接使用而不用通过其他引用对象,那么它就是强可达。一个新创建的对象对创建它的线程来讲就是强可达的。

  • 如果一个对象没有强可达性,但是它可以通过一个软引用(soft reference.)来使用,那么它就具有软可达性。

  • 如果一个对象既没有强可达性,也没有软可达性,但是它可以通过一个弱引用(weak reference)来使用,那么他就具有弱可达性。当弱引用指向的弱可达对象没有其他的引用,那么这个对象就会被回收。

  • 如果一个对象既没有强可达性,也没有软可达性、弱可达性,他已经被finalized,并且有一些虚引用(phantom reference)指向它,那么它就具有虚可达性。

  • 当一个对象不能通过以上的方式指向,那么这个对象就变得不可达,并因此适合被回收。

强可达(Strongly reachable)
被new出来的对象都是强可达的,他们的引用就是强引用。任何通过强引用所使用的对象都不会被GC回收。
软可达(Softly reachable)
只有当系统需要更多内存时,GC才会回收具有软可达性的对象。在内存不足前,GC保证一定回收软可达的对象。
关于软引用(SoftReference)何时应该被回收的算法依赖于不同的JVM发行版本。它往往是一个跟引用(reference)的使用频率和使用间隔有关的函数。
弱可达(Weakly reachable)
它也是用来描述非需对象的,但它的强度比软引用更弱些,被弱引用关联的对象只能生存岛下一次垃圾收集发生之前。当垃圾收集器工作时,无论当前内存是否足够,都会回收掉只被弱引用关联的对象。
弱引用不能阻止垃圾回收机制清理他指向的引用。弱引用最常见的使用情景是通过WeakHashMap。它是一种简单地将对象的生命周期跟Map中对象的索引域(key)绑定的方式。只有当WeakHashMap中的Key是强可达,也就是WeakHashMap中的数据域(Data域)的对象,在应用程序的其他地方有别的引用的时候,它里面的值才不会被回收。一旦应用程序中没有其他对WeakHashMap中对象的引用,那么它的所有的key就会变成弱可达,不需要用户的额外干预,所有WeakHashMap中的对象都会被清除。这是一种优雅地防止内存泄露的方式。

虚可达(Phantom reachable)
最弱的一种引用关系,完全不会对其生存时间构成影响,也无法通过虚引用来取得一个对象实例。为一个对象设置虚引用关联的唯一目的是希望能在这个对象被收集器回收时收到一个系统通知。

参考:
https://docs.oracle.com/javase/8/docs/api/java/lang/ref/package-summary.html
http://www.ibm.com/developerworks/cn/java/j-lo-langref/

你可能感兴趣的:(java,对象,Java-lang)