参考自杨雪峰老师《java 核心技术36 讲》-4 与
这几种的引用的不同主要在于对象不同的可达性状态和对垃圾回收的影响。
可达性:(GC机制的一种判断策略,该对象引用链均不可访问到该对象,此时该对象不可达,无法使用,随即被回收)
强引用: 生命周期最长比如我们平时 new 创建一个对象,赋值给该对象类型的引用变量时,这种关系就是强引用,除非该对象的所有引用变量被显示的赋值为了null或者不再指向该对象,否则不会被回收。
软引用:生命周期比强引用短,通过SoftReference类实现可以和ReferenceQueue一起使用,当软引用对象被回收前,JVM就会出把他ReferenceQueue中,可以调用ReferenceQueue的poll()方法来检查是否有它所关系的对象被回收,一般情况不会被回收,只有内存不足,JVM在抛出OutOfMemoryError之前一定会被回收,以确保内存供应,--------------常用来实现内存敏感的缓存。
弱引用: 生命周期比软引用短,通过WeakReference类实现,不管内存是否不足,可以回收时都会被回收,也可以和ReferenceQueue一起使用,被回收前,JVM会将其加入ReferenceQueue,--------------弱应用同样可用于内存敏感的缓存。
幻象引用 / 虚引用:通过PhantomReference类来实现。无法通过虚引用访问对象的任何属性或函数。幻象引用仅仅是提供了一种确保对象被 finalize 以后,做某些事情的机制。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。虚引用 必须和引用队列 (ReferenceQueue)联合使用。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中--------------可用来跟踪对象被垃圾回收器回收的活动,比如当此类对象被垃圾收集器回收之前执行某种操作。
-------------------------------------------------------------------
引用--海怪哥哥,形象描述:
强引用 就像大老婆,关系很稳固。
软引用 就像二老婆,随时有失宠的可能,但也有扶正的可能。
弱引用 就像情人,关系不稳定,可能跟别人跑了。
幻像引用 就是梦中情人,只在梦里出现过。
------------------------------------------------------------------