JVM之垃圾回收相关概念之引用
前言
- 带着问题去阅读,==强引用、软引用、弱引用、虚引用有什么区别?具体使用场景 是什么?
1.强引用
- 强引用(StrongReference)
最传统的引用定义,程序代码中普遍存在引用赋值,类似“Object A= new Object()”这种引用关系
- 无论任何情况下,只要强引用关系还存在,是可触及的,被引用的对象就永远不会被垃圾回收器回收掉。
- 普通系统99%以上都是强引用。
- 强引用是造成java内存泄漏的主要原因之一。
- 强引用可以直接访问目标对象。
2.软引用
- 软引用(SoftReference)
- 系统将要发生溢出才会对其进行回收,如果这次回收之后内存还是不足就会OOMError。
- 应用场景:通常来实现内敏感的缓存。比如:高速缓存,mybatis缓存
- 如果有内存,就暂时保留缓存,内存不足及时清理,这样就保证了有缓存的同时,不会耗尽内存。
- 垃圾回收器在某一时刻决定回收软壳大的对象的时候,会清理软引用,并可选的把引用存放到一个引用队列(Reference Queue)。
3.弱引用
- 弱引用(WeakReference)
- 被弱引用关联的对象只能存活到下一垃圾收集之前,当垃圾回收器收集工作时,无论内存是否够用,都会回收掉弱引用关联的对象。
- 垃圾回收气的线程通常优先级很低,如果不及时发现持有弱引用的对象,这种情况,弱引用对象就能存在较长时间。
- 同样可以指定一个引用队列
- 软引用和弱引用非常适合来保存那些可有可无的缓存数据。
4.虚引用
- 虚引用(PhantomReference)
- 一个对象是否有虚引用的存在,完全不会都对其生存时间造成影响,也无法通过一个虚引用获得一个对象实力。
- 为对象设置虚引用关联的唯一目的,就是能在对象被垃圾回收器回收时收到一个系统通知(不想finalize,是对象自己的方法)。
- 虚引用必须和引用队列一起使用。
总结
强软弱虚,引用强度依次递减。