软引用(SoftReference)的含义是,如果一个对象只具有软引用,而当前虚拟机堆内存空间足够,那么垃圾回收器就不会回收它,反之就会回收这些软引用指向的对象。
弱引用(WeakReference)与软引用的区别在于,垃圾回收器一旦发现某块内存上只有弱引用(一定请注意只有弱引用,没强引用),不管当前内存空间是否足够,那么都会回收这块内存。
在第7行里,我们定义了SoftReference
接下来我们通过下表来观察下具体针对内存空间的操作:
二、软引用的使用场景
比如在一个博客管理系统里,为了提升访问性能,在用户在点击博文时,如果这篇博文没有缓存到内存中,则需要做缓存动作,这样其它用户在点击同样这篇文章时,就能直接从内存里装载,而不用走数据库,这样能降低响应时间。
我们可以通过数据库级别的缓存在做到这点,这里也可以通过软引用来实现,具体的实现步骤如下:
1、可以通过定义Content类来封装博文的内容,其中可以包括文章ID、文章内容、作者、发表时间和引用图片等相关信息。
2、可以定义一个类型为HashMap
3、当用户点击某个ID的文章时,根据ID到第二步定义的HashMap里去找,如果找到,而且所对应的SoftReference
4、如果用户点击的某个文章的ID在HashMap里找不到,或者虽然找到,但对应的值内容是空,那么就从数据库去找,找到后显示这个文章,同时再把它插入到HashMap里,这里请注意,显示后需要撤销掉这个Content类型对象上的强引用,保证它上面只有一个软引用。
来分析下用软引用有什么好处?
假设我们用1个G的空间缓存了10000篇文章,这10000篇文章所占的内存空间上只有软引用。如果内存空间足够,那么我们可以通过缓存来提升性能,但万一内存空间不够,我们可以依次释放这10000篇文章所占的1G内存,释放后不会影响业务流程,最多就是降低些性能。
对比一下,如果我们这里不用软应用,而是用强引用来缓存,由于不知道文章何时将被点击,我们还无法得知什么时候可以撤销这些文章对象上的强引用,或者即使我们引入了一套缓存淘汰流程,但这就是额外的工作了,这就没刚才使用“软引用“那样方便了。
WeakHashMap和HashMap很相似,可以存储键值对类型的对象,但我们可以从它的名字上看出,其中的引用是弱引用。通过下面的WeakHashMapDemo.java,我们来看下它的用法。
通过下表,我们来详细说明关键代码的含义:
根据上文和这里的描述,我们知道如果当一个对象上只有弱引用时,这个对象会在下次垃圾回收时被回收,下面我们给出一个弱引用的使用场景。
比如在某个电商网站项目里,我们会用Coupan这个类来保存优惠券信息,在其中我们可以定义优惠券的打折程度,有效日期和所作用的商品范围等信息。当我们从数据库里得到所有的优惠券信息后,会用一个List
而且,我们想要用一种数据结构来保存一个优惠券对象以及它所关联的所有用户,这时我们可以用WeakHashMap
大家可以想象下,如果有100个优惠券,那么它们会存储于List
这样的话,一旦当优惠券或用户发生变更,它们的对应关系就能自动地更新,具体表现如下:
1、当某个优惠券(假设对应于coupan2对象)失效时,我们可以从coupanList里去除该对象,coupan2上就没有强引用了,只有weakCoupanHM对该对象还有个弱引用,这样coupan2对象能在下次垃圾回收时被回收,从而weakCoupanHM里就看不到了。
2、假设某个优惠券coupan3用弱引用的方式指向于100个用户,当某个用户(假设user1)注销账号时,它会被从List
如果不用弱引用,而是用常规的HashMap
转自:
https://mp.weixin.qq.com/s?__biz=MzI1NDQ3MjQxNA==&mid=2247486083&idx=1&sn=11fb39b27fefb7ae1c8ce1a7bc077c3c&chksm=e9c5f332deb27a24182206a4a68710ee10ee1b7b053e262c416d52ff963b4193ddca0ef9a6f4&scene=21#wechat_redirect