Java四种引用类型,按照引用类型的强弱顺序分别是
- 强引用
- 软引用
- 弱引用
- 虚引用
背景:我们希望有这样一种场景像缓存一样,
即:在内存还足够时,希望能够保留这些对象,当内存不够时,则删除这些对象(当然是由垃圾回收完成)。
强引用:
即我们日常的操作,像:Object obj=new Object(); 有一个引用指向这个对象。
只要强引用还存在就不会被垃圾回收线程回收了。
软引用:
即那些不是必需的对象,进行垃圾回收时,如果内存够,被垃圾回收程序标记,并在第二次垃圾回收时进行回收,
如果内存不够就会被垃圾回收器直接回收掉,如果还是不够内存则抛出内存溢出异常。
关键类:SoftReference;
弱引用:
即无论内存是否足够只要垃圾回收器触发,就会把弱引用引用的对象当作垃圾回收掉。
关键类:WeakReference
虚引用:
一个对象是否有虚引用存在,完全不会对对象的生存时间构成影响,也无法通过虚引用获得一个对象实例,
为一个对象设置虚引用的唯一目的就是在这个对象被收集器回收时返回一个系统通知。
虚引用必须和引用队列(ReferenceQueue)联合使用。当垃圾回收器准备回收一个对象时,
如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。
关键类:Phantom Reference
总结
引用类型 | 垃圾回收时间 | 用途 | 生存时间 |
强引用 | 强引用还在就会一直存在 | 对象的常规状态 | JVM停止运行 |
软引用 | 内存不足时 | 缓存 | 内存不足时 |
弱引用 | 正常垃圾回收 | 缓存 | 垃圾回收发生时 |
虚引用 | 正常垃圾回收 | 跟踪垃圾回收 | 垃圾回收发生时 |