美文网首页
Java的四种引用方式

Java的四种引用方式

作者: 积木Blocks | 来源:发表于2018-09-11 01:35 被阅读78次

    1.强引用


    • 默认的引用类型
    • 如果一个对象具有强引用,那么垃圾回收器是不会对它进行回收的,当内存不足的时候,Java虚拟机将抛出OutOfMemoryError错误。
    • 如果想切断强引用和某个对象的关联,可以显式地将引用赋值为null,JVM在合适的时间就会回收该对象

    2.软引用 SoftReference


    • 如果一个对象只有软引用,内存充足的时候,垃圾回收器不会对它进行回收操作,
    • 当内存不足的时候,这个对象会被回收。
    • 实现内存敏感的高速缓存
    • 配合ReferenceQueue使用,当软引用指向的对象被垃圾回收器回收后,Java虚拟机将会把这个软引用加入到与之关联的引用队列中。

    3.弱引用 WeakReference


    • 弱引用比软引用更弱
    • 只有弱引用指向的对象的生命周期更短,当垃圾回收器扫描到只具有弱引用对象时,不论当前内存空间是否不足,都会对弱引用进行回收。
    • 不过垃圾回收器是优先级较低的线程,不能迅速发现弱引用
    • 配合ReferenceQueue使用,当弱引用指向的对象被垃圾回收器回收后,Java虚拟机将会把这个弱引用加入到与之关联的引用队列中。

    4.虚引用 PhantomReference


    • 和软引用,弱引用不同,虚引用不会对所指向的对象生命周期产生影响
    • 本质是一个标记作用,用来跟踪对象被垃圾回收的活动,虚引用必须和队列配合使用
    • 配合ReferenceQueue使用,当虚引用指向的对象被垃圾回收器回收后,Java虚拟机将会把这个虚引用加入到与之关联的引用队列中。

    5. 引用队列 ReferenceQueue


    • 配合软引用,弱引用,虚引用使用,当引用的对象将要被JVM回收时,会将其加入到引用队列中。
    • 通过引用队列可以了解JVM垃圾回收情况。

    6.使用场景


    • 利用软引用和弱引用解决OOM问题:用一个HashMap来保存图片的路径和相应图片对象关联的软引用之间的映射关系,在内存不足时,JVM会自动回收这些缓存图片对象所占用的空间,从而有效地避免了OOM的问题
    • 通过软可及对象重获方法实现Java对象的高速缓存:
      • 比如我们创建了一Employee的类,如果每次需要查询一个雇员的信息。哪怕是几秒中之前刚刚查询过的,都要重新构建一个实例,这是需要消耗很多时间的。我们可以通过软引用和 HashMap 的结合,先是保存引用方面:以软引用的方式对一个Employee对象的实例进行引用并保存该引用到HashMap 上,key 为此雇员的 id,value为这个对象的软引用,另一方面是取出引用,缓存中是否有该Employee实例的软引用,如果有,从软引用中取得。如果没有软引用,或者从软引用中得到的实例是null,重新构建一个实例,并保存对这个新建实例的软引用

    参考:《Android高级进阶》-顾浩鑫

    相关文章

      网友评论

          本文标题:Java的四种引用方式

          本文链接:https://www.haomeiwen.com/subject/vmcygftx.html