笔记之——Java 中的强、软、弱、虚 - 4种引用类型
2020-07-04 本文已影响0人
xulee
1. 强 - StrongReference
- 创建: 普通 new 的对象都是强引用
- 回收: 只要引用还在,就不会被回收
- 即使内存不够,JVM宁可抛OOM
2. 软 - SoftReference
- 创建:先new 一个强引用的实例,然后用 SoftRefrence 包裹它,再将这个实例设置为 null(这个实例对象就只有软引用了)
Apple apple = new Apple()
SoftReference softReference = new SoftReference<>(apple ) // softReference本身是强引用,只是 apple 附加上了软引用
apple = null // 去强引用,softReference 就持有了apple 的软引用,要获取apple 对象,只能通过softReference.get()获取
- 引用对象的回收:内存不足的时候才回收
- 自身的回收:softReference 本身是new 出来,是强引用,可通过 ReferenceQueue 进行回收管理
3. 弱 - WeakReference
- 创建:同2, 只是改为用WeakReference包裹
- 引用对象的回收:不管内存空间是否足够,在下一次垃圾回收之前都会被回收
- 自身的回收:同2
4. 虚 - PhantomReference
- 创建:必须配合ReferenceQueue 使用
Apple apple = new Apple()
ReferenceQueue queue = new ReferenceQueue()
SoftReference softReference = new SoftReference(apple, queue)
apple = null
- 引用的对象的回收:随时都可能被回收
- 自身的回收:同2,3
注:不同于1,2,3种引用,此处引用和没有引用并不会影响apple的回收情况,即引用与否没有任何区别,在 apple = null (只有虚引用的情况下)时,apple随时可能被回收,但被回收之前softReference会被添加到queue中,从而可以通过判断 queue 是否为空来判断apple 是否已经被回收
注意:
以上都有写:apple = null,是为只保留一种引用方式,如果apple 未设置为null,则apple 一直为强引用类型
Object obj = weakReference.get() // obj 是强引用