NAIVE

1,361 阅读3分钟
  1. 强Strong,弱Weak,软Soft,虚Phantom引用Reference 已知: 与垃圾收集相关,强引用不会被主动清除,弱引用会被垃圾收集器主动收集 问题: 四种引用要如何定义,如何区分,如何辨别? 材料: 定义: 区别: ①对象的可达性状态(reachable)②对垃圾收集的影响

定义 对象的可达性状态 对垃圾收集的影响 应用 强 最常见的普通对象引用 可达 不会处理

软 相对强引用弱化一些的引用

常用于实现内存敏感的缓存

只在jvm任务内存不足时,才会试图回收软引用指向的对象 jvm可以保证在抛出OutOfMemoryException前,清理软引用指向的对象

用于实现内存敏感的缓存 弱

访问弱引用状态下的对象发 不豁免垃圾收集 用于构建没有特定约束的关系 维护非强制性的映射关系 缓存实现 虚/幻象 确保对象被finalize后做某些事情的机制 不能通过其访问对象

post-mortem清理机制 java平台的cleaner机制 用于 对象可达性状态流转

对象的五种可达性状态 强可达(Strongly Reachable):当一个对象可以有一个或多个线程可以不通过各种引用访问到的情况。比如,我们新创建一个对象,那么创建它的线程对它就是强可达。 软可达(Softly Reachable):只能通过软引用才能访问到对象的状态。 弱可达(Weakly Reachable):无法通过强引用或者软引用访问,只能通过弱引用访问时的状态。这是十分临近 finalize 状态的时机,当弱引用被清除的时候,就符合 finalize 的条件了。 幻象可达(Phantom Reachable):没有强、软、弱引用关联,并且 finalize 过了,只有幻象引用指向这个对象的时候。 以上所有引用类型,都是抽象类 java.lang.ref.Reference 的子类,你可能注意到它提供了 get() 方法:

虚引用的get方法总是返回null。其它引用,只要对象还没有被销毁,就可以通过get方法访问到。及弱引用和软引用可以get到对象后 将其重新引向强引用,因此上图中这两个步骤是双向的。因此,gc也需要二次确认,处于软引用和弱引用的对象没有被转化为强引用。 不可达(unreachable):意味着对象可以被清除了。

对象可达性部分的决定了jvm的垃圾收集

如果我们错误的保持了强引用(比如,赋值给了 static 变量),那么对象可能就没有机会变回类似弱引用的可达性状态了,就会产生内存泄漏。所以,检查弱引用指向对象是否被垃圾收集,也是诊断是否有特定内存泄漏的一个思路,如果我们的框架使用到弱引用又怀疑有内存泄漏,就可以从这个角度检查。