Java 引用类型
- 强引用
- 软引用
- 弱引用
- 虚引用
基本概念
- 强引用:不会被回收,内存不足会OOM,置为Null后可以被回收
使用方式:Object obj = new Object(); - 软引用:非必须,但还有用的对象,例如缓存。
使用方式:使用SoftReference创建,内存不足会回收。 - 弱引用: 描述非必须对象。
使用方式:使用WeakReference创建,一旦发现则被回收。 - 虚引用:最弱的一种引用,用于追踪垃圾回收过程,当垃圾回收器准备回收一个对象时,如果还有虚引用,则会在垃圾回收后销毁这个对象,将这个虚引用加入引用队列,一个对象是否有虚引用完全不会对其生存时间构成影响,也无法通过虚引用来取得一个对象实例,为一个对象设置虚引用关联的唯一目的就是能在这个对象被收集器回收时收到一个通知。
使用方式:使用PhantomReference创建。
为什么需要不同类型的引用类型
因为Java内存回收是虚拟机主动触发,所以无法像C一样控制释放操作,但Java需要控制回收时机,所以有了引用类型。比如软 弱引用解决了OOM,软引用解决缓存。
场景:
强引用:new 创建对象
软引用:缓存,避免OOM
弱引用:同软引用类似。
虚引用:必须同引用队列一同使用,唯一场景就是跟踪垃圾回收过程。
虚引用作用
Java垃圾回收过程中的对象可触及状态改变时垃圾回收器会把要回收的对象添加到Reference Queue种,这样在可触及性发生变化的时候上层代码就会得到通知,保证在GC时可以做一些事情。