Java Reference 详解

作者: 聪明的奇瑞 | 来源:发表于2018-07-24 11:54 被阅读9次

GC 回收策略-可达性分析

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

什么是 Reference ?

  • Reference 是 Java 引用的顶层抽象类,它可以和普通的对象一样操作,在一定的限制条件下,还支持和 GC 进行交互

强引用

  • Java 引用中我们最熟悉的就是强引用,例如下面代码 object 和 str 都是强引用
Object object = new Object();
String str = "hello";
  • GC 在回收时会检测对象是否存在强引用,如果存在即使触发 GC 执行时也不会被回收
public void test(){
    Object object = new Object();
}
  • 当方法执行完毕之后,方法中申明的引用 object 就会被出栈,栈资源就会被释放,此时无任何引用指向 Object 对象,当下次触发 GC 时其就会被回收
  • 我们也可以显示的将引用赋值为 null,这样 GC 触发时就会回收该对象,例如 Vector 类中 clear 方法就是通过将引用赋值为 null 来实现清理工作的
   public synchronized E remove(int index) {
        modCount++;
        if (index >= elementCount)
            throw new ArrayIndexOutOfBoundsException(index);
        Object oldValue = elementData[index];

        int numMoved = elementCount - index - 1;
        if (numMoved > 0)
            System.arraycopy(elementData, index+1, elementData, index,
                    numMoved);
        elementData[--elementCount] = null; // Let gc do its work

        return (E)oldValue;
    }

软引用

  • 它需要通过软引用对象来访问
SoftReference<String> softRef = new SoftReference<>("aaaa");
  • 软引用对象在内存不足(OOM 异常),垃圾回收器会回收软引用所指向的对象,该特性适合用来实现缓存(如网页缓存,图片缓存)
  • 软引用可以和一个引用队列(ReferenceQueue)结合使用,如果软引用对象被 GC 回收,那么该软引用就会被加入到与之关联的引用队列中

弱引用

  • 它需要通过弱引用对象来访问
WeakReference<String> weakRef = new WeakReference<>("aaaa");
  • 当一个对象仅仅被弱引用指向, 而没有任何其他强引用指向的时候, 如果 GC 运行, 那么这个对象就会被回收。它的一个特点就是不太确定何时被回收,由 GC 判断

虚引用

  • 虚引用和软、弱引用不同,它并不影响对象的生命周期,如果一个对象跟虚引用关联则跟没有引用与之关联一样,在任何时候都可能被 GC 回收
  • 虚引用必须和引用队列一起使用,当 GC 准备回收一个对象时,如果发现其有虚引用,则会把该虚引用加到与之关联的引用队列中
  • 一般用于实现追踪垃圾收集器的回收动作,比如在对象被回收时候,会调用对象的 finalize 方法,在使用虚引用可以实现该动作,也更安全
ReferenceQueue<String> queue = new ReferenceQueue<String>();
PhantomReference<String> pr = new PhantomReference<String>(new String("hello"), queue);

相关文章

  • Java Reference 详解

    GC 回收策略-可达性分析 从 GC Roots 开始向下搜索,搜索所走过的路径称为引用链,当一个对象到 GC R...

  • Java Reference详解

    本文参考了:http://blog.csdn.net/androidstar_cn/article/details...

  • Java的四种引用和回收策略

    参考:Java Reference详解 .这篇讲的很清楚!!理解这些引用类型 注意一点,当JVM回收时,如果有回收...

  • 手游服务器开发

    reference手游服务器开发技术详解

  • ReferenceQueue的处理

    java.lang.ref.Reference类中有静态块启动线程(java.lang.ref.Reference...

  • Java Reference类

    Java Reference类 Reference类时SoftReference、WeakReference、Ph...

  • Java Reference

    GC 回收确认对象是否存活的可达性分析 从 GC Roots 开始向下搜索,搜索所走过的路径称为引用链,当一个对象...

  • java Reference

    java 引用类型: 强,软,弱,虚,引用对象的能力依次减弱。 强引用 (FinalReference) 这里 a...

  • Reference 、ReferenceQueue 详解

    ReferenceQueue 引用队列,在检测到适当的可到达性更改后,垃圾回收器将已注册的引用对象添加到该队列中 ...

  • 理解弱引用

    Soft,Weak,Phantom Reference java.lang.ref.Reference 是他...

网友评论

    本文标题:Java Reference 详解

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