Java Reference

作者: 聪明的奇瑞 | 来源:发表于2018-05-10 16:14 被阅读23次

    GC 回收确认对象是否存活的可达性分析

    • 从 GC Roots 开始向下搜索,搜索所走过的路径称为引用链,当一个对象到 GC Roots 没有任何引用链时,则证明此对象时不可用的,不可达对象
    • 在现实情况我们往往需要通过把指向某个对象的 Reference 置空来保证这个对象在下次 GB 运行的时候被回收
    Object c = new Car();
    c=null;
    
    • 可手动置空是一个很繁琐的事情,对于简单状况,手动置空是不需要程序员来做的,因为对于简单对象,当调用它的方法执行完毕之后,所指向它的引用会被 stack(栈)中 popup(出栈),所以它就能在下一次 GB 执行时被回收了

    什么是 Reference ?

    • Java 引用中我们最熟悉的就是 强引用(如 A a = new A();),GC 在回收时会检测对象是否存在强引用,如果存在则不会进行回收
    • Reference 是 Java 中引用的顶层抽象类,它可以和普通的对象一样操作,在一定的限制条件下,还支持和垃圾收集器的交互
    • Java 提供了四种不同类型的引用,引用级别从高到低分为:
      • StrongReference(强引用):它指的是程序中有直接可达的引用,不需要通过任何引用对象,如下面代码中 obj 则为强引用,如果一个对象到 GC Roots 之间存在强引用,即使内存不足(OOM 异常)也不会 GC 所回收
      Object obj = new Object();
      
      • SoftReference(软引用):它需要通过软引用对象来访问,软引用对象在内存不足(OOM 异常),垃圾回收器会决定回收软引用所指向的对象
      SoftReference<Object> softRef = new SoftReference<Object>(new Object());
      
      • WeakReference(弱引用):它需要通过弱引用对象来访问,当一个对象仅仅被 WeakReference 指向, 而没有任何其他 StrongReference 指向的时候, 如果 GC 运行, 那么这个对象就会被回收。它的一个特点就是不太确定何时被回收,由 GC 判断
      WeakReference<Object> weakRef = new WeakReference<Object>(new Object());
      
      • PhantomReference(虚引用):该引用必须和引用队列(ReferenceQueue)一起使用,一般用于实现追踪垃圾收集器的回收动作,比如在对象被回收时候,会调用对象的 finalize 方法,在使用虚引用可以实现该动作,也更安全
      Object obj = new Object();
      ReferenceQueue<Object> refQueue = new ReferenceQueue<>();
      PhantomReference<Object> phantom = new PhantomReference<Object>(obj, refQueue);
      

    相关文章

      网友评论

        本文标题:Java Reference

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