什么是强引用?
当一个对象通过普通的赋值操作(如 Object obj = new Object()
)被引用时,该对象就有一个强引用
Object object = new Object();
特点
- 只要强引用存在,该引用指向的对象就不会被垃圾回收机制回收。(内存不足也不会回收)
- 存在的生命周期:
- 将 object 被置为 null 的时候,被标记为可回收
- object超出其作用域的时候,被标记为可回收
什么是弱引用?
弱引用通过 java.lang.ref.WeakReference 类实现。子类通过继承该类可实现子类特定的属性和行为。也可以直接使用 WeakReference 实现弱引用。
Object object = new Object();
WeakReference<Object> weak = new WeakReference<>( object );
//将对象的强引用置为null,此时创建的Object对象只剩下弱引用
object = null;
特点
- 当一个对象只有弱引用指向它时,它在下一次GC时会被回收
- WeakReference 里有一个引用队列,此队列用于存放GC后的 WeakReference 对象
代码示例
public static void main( String[] args ) {
HashMap<String, String> map = new HashMap<>( 3 );
WeakReference<HashMap> weak = new WeakReference<>( map );
map.put( "a", "a" );
map.put( "b", "b" );
System.out.println( JSONUtil.toJsonStr( weak.get() ) );
//移出强引用
map = null;
//显示调用gc
System.gc();
System.out.println( JSONUtil.toJsonStr( weak.get() ) );
}
- 创建一个HashMap对象,将此对象指向map变量。此时map变量对于创建的对象来说,它们之间是强引用
- 创建一个弱引用对象,map作为构造方法参数传入。此时建立了一个HashMap对象的弱引用。
- 操作数据
- 将指向对象的强引用消除
- 手动调用GC
- 再次调用弱引用,此时使用弱引用对象再次获取HashMap对象,输出是 null
原理图解
当map对HashMap强引用被消除后,只剩下弱引用,后续若没有强引用指向HashMap对象,就会被GC。
week本身指向WeakReference对象的是强引用,所以就算GC后,WeakReference对象也不会被GC。
ReferenceQueue用于存放GC后的WeakReference对象,便于后续处理。(可选项)