内容简介:主要差别:对象不同的转载请注明出处:http://zhongmingmao.me/2019/04/24/java-core-reference/
主要差别:对象不同的 可达性 (reachable)和对 垃圾收集 的影响
强引用 - Strong
- 最常见的 普通对象引用 ,只要还有强引用指向一个对象,就表明该对象还存活,垃圾收集器不会处理这种对象
- 一个普通的对象,如果没有其他的引用关系,一旦超过了引用的作用域或者显式地将强引用赋值为null,就有可能被收集
软引用 - Soft
- 软引用是一种相对于强引用 弱化 一些的引用,可以让对象 豁免一些垃圾收集 (内存不足)
- 只有当JVM认为 内存不足 时,才会去试图回收软引用指向的对象
- JVM会确保在抛出OutOfMemoryError之前,清理软引用指向的对象,软引用通常用来实现 内存敏感的缓存
弱引用 - Weak
- 弱引用 不能使对象豁免垃圾收集 ,仅仅只是提供一种 访问在弱引用状态下对象 的途径
- 弱引用可以用来构建一种 没有特定约束的关系 ,例如维护一种 非强制性的映射关系
- 如果试图获取时对象还在,就使用它,否则重新实例化
- 弱引用也是很多 缓存 实现的选择
虚引用 - Phantom
- 不能通过虚引用访问到对象 ,虚引用仅仅只是提供一种机制: 确保对象被finalize以后执行某些事情
- 可以利用虚引用 监控对象的创建和销毁
可达性状态
- 强可达(Strongly Reachable)
- 当一个对象可以有一个或多个线程 可以不通过各种引用访问到 的情况
- 例如,新创建一个对象,那么创建该对象的线程对它就是强可达
- 软可达(Softly Reachable)
- 只能通过 软引用 才能访问到对象的状态
- 弱可达(Weakly Reachable)
- 无法通过 强引用 或者 软引用 访问,只能通过 弱引用 访问时对象的状态
- 这是十分 临近finalize 的时机,当 弱引用被清除 时,就符合finalize的条件了
- 虚可达(Phantom Reachable)
- 没有强引用、软引用和弱引用关联
- 对象被 finalize 过,只有 虚引用 指向该对象
- 不可达(UnReachable)
- 意味着对象可以被 清除 了
Reference
- 所有的引用类型,都是
java.lang.ref.Reference
的子类,提供T get()
方法- The object to which this reference refers, or null if this reference object has been cleared
- 除了 虚引用 (get()永远返回null),如果对象还没有被 销毁 ,都可以通过get()获取 原对象
- 利用软引用和弱引用,可以将访问到的对象,重新指向强引用,即人为的改变对象的可达性状态
- 因此垃圾收集器会存在 二次确认 的问题,以保证处于 弱引用状态 的对象,没有改变为强引用
ReferenceQueue
Object counter = new Object(); ReferenceQueue referenceQueue = new ReferenceQueue(); PhantomReference<Object> p = new PhantomReference<>(counter, referenceQueue); counter = null; System.gc(); try { // 限时阻塞 Reference<Object> reference = referenceQueue.remove(1000L); if (reference != null) { // do something } } catch (Exception e) { }
- 创建各种引用关系并 关联到相应对象 时,可以选择是否需要 关联到引用队列
- JVM会在 特定时机 将引用enqueue到引用队列里
- 我们可以从引用队列里获取引用(remove方法)后进行后续逻辑
- 尤其对于 虚引用 ,get方法只会返回null,如果再不关联引用队列,基本没什么意义了
- 利用引用队列,可以在对象处于 相应状态 时,执行后续的处理逻辑
- 对于 虚引用 来说,相应的状态指的是对象被 finalize 后,处于 虚可达 状态
PrintReferenceGC
// -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintReferenceGC 1.926: [GC (Allocation Failure) 1.929: [SoftReference, 0 refs, 0.0000249 secs]1.929: [WeakReference, 439 refs, 0.0000364 secs]1.929: [FinalReference, 1187 refs, 0.0017734 secs]1.931: [PhantomReference, 0 refs, 0 refs, 0.0000126 secs]1.931: [JNI Weak Reference, 0.0000120 secs][PSYoungGen: 33280K->3068K(38400K)] 33280K->3140K(125952K), 0.0059535 secs] [Times: user=0.01 sys=0.01, real=0.00 secs]
转载请注明出处:http://zhongmingmao.me/2019/04/24/java-core-reference/
访问原文「Java核心 -- 引用」获取最佳阅读体验并参与讨论
以上所述就是小编给大家介绍的《Java核心 -- 引用》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 乐字节Java8核心特性实战之方法引用
- 强引用、软引用、弱引用、虚引用
- java的强引用、软引用、弱引用、幻象引用,引用队列总结
- Java 对象引用方式 —— 强引用、软引用、弱引用和虚引用
- 强引用、软引用、弱引用、幻象引用有什么区别?
- 你确定真的了解 Java 四种引用(强引用、弱引用、软引用、虚引用)了吗?
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。