Java之强引用与弱引用

什么是强引用?

当一个对象通过普通的赋值操作(如 Object obj = new Object())被引用时,该对象就有一个强引用

Object object = new Object();
特点
  1. 只要强引用存在,该引用指向的对象就不会被垃圾回收机制回收。(内存不足也不会回收)
  2. 存在的生命周期:
    1. 将 object 被置为 null 的时候,被标记为可回收
    2. object超出其作用域的时候,被标记为可回收

什么是弱引用?

弱引用通过 java.lang.ref.WeakReference 类实现。子类通过继承该类可实现子类特定的属性和行为。也可以直接使用 WeakReference 实现弱引用。

        Object object = new Object();
        WeakReference<Object> weak = new WeakReference<>( object );
        //将对象的强引用置为null,此时创建的Object对象只剩下弱引用
        object = null;
        
特点
  1. 当一个对象只有弱引用指向它时,它在下一次GC时会被回收
  2. 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() ) );
    }
  1. 创建一个HashMap对象,将此对象指向map变量。此时map变量对于创建的对象来说,它们之间是强引用
  2. 创建一个弱引用对象,map作为构造方法参数传入。此时建立了一个HashMap对象的弱引用。
  3. 操作数据
  4. 将指向对象的强引用消除
  5. 手动调用GC
  6. 再次调用弱引用,此时使用弱引用对象再次获取HashMap对象,输出是 null
原理图解

当map对HashMap强引用被消除后,只剩下弱引用,后续若没有强引用指向HashMap对象,就会被GC。

week本身指向WeakReference对象的是强引用,所以就算GC后,WeakReference对象也不会被GC。

ReferenceQueue用于存放GC后的WeakReference对象,便于后续处理。(可选项)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值