软引用和弱引用对内存性能的帮助

软引用和弱引用对内存性能的帮助

先了解一下什么是强引用
比如new一个对象 String a = new String("abc");其中a为强引用。
软引用(SoftReference):
如果一个对象只具有软引用,而当前虚拟机堆内存空间足够,那么垃圾回收器就不会回收它,反之就会回收这些软引用所指向的对象。

弱引用(WeakReference):
垃圾回收器一旦发现某块内存上只有弱引用,不管当前内存空间是否足够,那么都会回收这块内存。

    public static void main(String[] args) {
        String str = new String("abc"); //强引用
        SoftReference<String> soft = new SoftReference<String>(str);//软引用
        str = null; //去掉强引用
        System.gc();//垃圾回收
        System.out.println(soft.get());

        String abc = new String("123");
        WeakReference<String> weak = new WeakReference<String>(abc);//弱引用
        abc = null;//去掉强引用
        System.gc();//垃圾回收
        System.out.println(weak.get());
    }
}

输出 的答案是
在这里插入图片描述
软引用的使用场景:
在这里插入图片描述

使用强引用指向博文对象Content,而软引用做缓存。用

HashMap<String,SoftReference<Content>>

来保存缓存内容。
Key:String类型,保存文章ID
Value:是一个指向content的软引用

作用:当用户浏览博文,通过id找content,当有对应的value,直接返回;如果没有或者为空时,再操作数据库,再插到缓存中。需要删除强引用,只保留软引用,当内存空间不足会渐渐释放软引用内存。

对比:如果用强引用来做缓存,由于我们不知道什么时候该撤销在content上的强引用,使用我们找不到一个合适的机会来释放缓存,and如果我们在引入一套缓存机制就是额外的工作了,就没有软引用这么直接方便了。

弱引用使用场景:

coupon优惠卷指向对应的用户,而用户又绑定的有强引用和弱引用。在这里插入图片描述
在这里插入图片描述

WeakHashMap<Coupon,List<WeakReference<User>>

基于弱引用的hashmap,
key:coupon
value:List<WeakReference<User>>
当某个用户注销了账号,即强引用为null时,软引用就会在下次垃圾回收时被回收,即100个用户会自动更新为99个

如果我们不用弱引用而用强引用,那么在用户被删除之后,需要手动删除用户和优惠卷之间的对应关系。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值