美文网首页
笔记之——Java 中的强、软、弱、虚 - 4种引用类型

笔记之——Java 中的强、软、弱、虚 - 4种引用类型

作者: xulee | 来源:发表于2020-07-04 17:01 被阅读0次

    1. 强 - StrongReference


    • 创建: 普通 new 的对象都是强引用
    • 回收: 只要引用还在,就不会被回收
    • 即使内存不够,JVM宁可抛OOM

    2. 软 - SoftReference


    • 创建:先new 一个强引用的实例,然后用 SoftRefrence 包裹它,再将这个实例设置为 null(这个实例对象就只有软引用了)
    Apple apple = new Apple()
    SoftReference softReference = new SoftReference<>(apple ) // softReference本身是强引用,只是 apple 附加上了软引用
    apple = null // 去强引用,softReference 就持有了apple 的软引用,要获取apple 对象,只能通过softReference.get()获取
    
    • 引用对象的回收:内存不足的时候才回收
    • 自身的回收:softReference 本身是new 出来,是强引用,可通过 ReferenceQueue 进行回收管理

    3. 弱 - WeakReference


    • 创建:同2, 只是改为用WeakReference包裹
    • 引用对象的回收:不管内存空间是否足够,在下一次垃圾回收之前都会被回收
    • 自身的回收:同2

    4. 虚 - PhantomReference


    • 创建:必须配合ReferenceQueue 使用
    Apple apple = new Apple()
    ReferenceQueue queue = new ReferenceQueue()
    SoftReference softReference = new SoftReference(apple, queue)
    apple = null 
    
    • 引用的对象的回收:随时都可能被回收
    • 自身的回收:同2,3

    注:不同于1,2,3种引用,此处引用和没有引用并不会影响apple的回收情况,即引用与否没有任何区别,在 apple = null (只有虚引用的情况下)时,apple随时可能被回收,但被回收之前softReference会被添加到queue中,从而可以通过判断 queue 是否为空来判断apple 是否已经被回收

    注意:


    以上都有写:apple = null,是为只保留一种引用方式,如果apple 未设置为null,则apple 一直为强引用类型

    Object obj = weakReference.get() // obj 是强引用 
    

    相关文章

      网友评论

          本文标题:笔记之——Java 中的强、软、弱、虚 - 4种引用类型

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