引用类型
强引用(默认支持模式)
当内存不足,JVM会进行垃圾回收,对于强引用的对象,就算是出现了OOM也不会对该对象进行回收
类似“Object o1 = new Object() ”这类的引用都是强引用,只要强引用还在,垃圾收集器就不会回收掉被引用的对象。即使该对象以后永远都不会被用到,JVM也不会回收,因此强引用是造成Java内存泄露的主要原因之一。
软引用
软引用是一种相对强引用弱化了一些的引用,SoftReference类实现
对于只有软引用的对象来说:
- 当系统内存足够的时候,不会被回收
- 当系统内存不足的时候,会被回收
软引用通常被用在对内存敏感的程序中,比如高速缓存
弱引用
弱引用比软引用更弱,WeakReference类实现
对于弱引用对象来说,只要发生GC,弱引用就会被回收,不管内存够不够
WeakHashMap
当key值消失被清除的时候,WeakHashMap中的节点也会被清除
虚引用
最弱的一种引用关系。PhantomReference类实现
虚引用并不会决定对象的生命周期,如果一个对象仅持有虚引用,那么它就和没有引用一样,在任何时刻都有可能会被垃圾回收器回收,它不能单独使用,也不能通过它访问对象,虚引用要和引用队列(ReferenceQueue)联合使用
设置虚引用的作用是在这个对象被GC的时候收到一个系统通知或者添加进一步的处理。Java允许使用finalize()方法在垃圾回收器将对象从内存中清除前做一些必要的清理工作
引用队列
ReferenceQueue是用来配合引用工作的,创建引用的时候可以指定关联的队列,当GC释放该对象的内存的时候,会将引用加入到引用队列中。
Object o1 = new Object();
ReferenceQueue referenceQueue = new ReferenceQueue();
PhantomReference<Object> reference = new PhantomReference<>(o1,referenceQueue);