java Reference

java引用分类

java引用分为4类,强引用、软引用、弱引用和虚引用。这四种引用跟gc的行为密切相关,gc在垃圾回收时根据引用的类型会有所不同。

 

强引用

强引用我们用的最多,随便new一个实例,然后用一个引用指向该实例,这个引用就是强引用了。对于强引用指向的对象,在垃圾回收时绝不会回收,即使内存不足抛出OutOfMemoryError。

 

软引用 SoftReference

对于软引用指向的对象,如果该对象上没有其他强引用,在垃圾回收时gc尽量不回收改对象,但在内存不足时,gc则会优先保证内存而回收掉该对象。这一点看起来好像很符合缓存的特征,gc可以根据内存使用状况决定回收与否,其实不然,如果软引用的对象的初始化过程较为耗时,我们的软引用缓存反而得不偿失。另外,引用对象给垃圾收集过程带来了一些附加的成本,每一次垃圾收集,都必须构造活跃 Reference 对象的一个列表,而且每个引用都必须做适当的处理,这给每次收集添加了一些每个 Reference 的开销,而不管该 referent 此时是否被收集。对于缓存还是建议使用一些成熟的组件如memcache、oscache等,他们都有自己的FIFO、LRU淘汰机制和过期算法,再不行就用HashMap之类的强引用,由自己根据业务的实际情况进行维护。软引用可以联合引用队列使用:

         (1)String str=new String("test");
         (2)ReferenceQueue<String> queue=new ReferenceQueue<String>();
         (3)SoftReference<String> sf=new SoftReference<String>(str,queue);
         (4)str=null;

第(2)步创建了一个引用队列,第(3)步创建一个软引用,指向”test“对象实例,并关联到引用队列queue。在第(4)步执行之前,“test”对象因为有一个str强引用故绝不会被垃圾回收;第(4)步之后,强引用str没有了,这时gc回收内存时若发现内存紧张,则会在回收掉“test”对象之前,将弱引用sf加入到引用队列queue,这时通过queue.poll()即可获得该sf。可见,只要监控联合引用队列我们就可以跟踪gc对软引用的回收情况。


弱引用 WeakReference

弱引用对象实例的生命周期比软引用还要短,在垃圾回收时,只要看到了弱引用并且也没有其他强引用指向他就坚决回收掉。同软引用一样,弱引用也可以联合引用队列一起使用来监控弱引用对象的回收情况:

         (1)String str=new String("test");
         (2)ReferenceQueue<String> queue=new ReferenceQueue<String>();
         (3)WeakReference<String> wf=new WeakReference<String>(str,queue);
         (4)str=null;

这里不再赘述。

 

虚引用 PhantomReference

虚引用形同虚设,并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,随时都可能被垃圾回。虚引用主要用来跟踪对象被垃圾回收的活动。不同于软引用和弱引用:虚引用必须 和引用队列联合使 用。当垃 圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。程序可以通过判断引用队列中是 否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收。程序如果发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动:

         (1)String str=new String("test");
         (2)ReferenceQueue<String> queue=new ReferenceQueue<String>();
         (3)PhantomReference<String> wf=new PhantomReference<String>(str,queue);
         (4)str=null;

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值