• Java reference的种类及使用场景


    Java 中一共有 4 种类型的引用 : StrongReference SoftReference WeakReference 以及 PhantomReference (传说中的幽灵引用).这 4 种类型的引用与 GC 有着密切的关系,  让我们逐一来看它们的定义和使用场景 :  

    1. Strong Reference

       StrongReference 是 Java 的默认引用实现,  它会尽可能长时间的存活于 JVM 内, 当没有任何对象指向它时 GC 执行后将会被回收  

    2.WeakReference

     WeakReference, 顾名思义,  是一个弱引用,  当所引用的对象在 JVM 内不再有强引用时, GC 后 weak reference 将会被自动回收  

    3.SoftReference 

       SoftReference 于 WeakReference 的特性基本一致, 最大的区别在于 SoftReference 会尽可能长的保留引用直到 JVM 内存不足时才会被回收(虚拟机保证), 这一特性使得 SoftReference 非常适合缓存应用  

    4.PhantomReference

       Phantom Reference(幽灵引用) 与 WeakReference 和 SoftReference 有很大的不同,  因为它的 get() 方法永远返回 null, 这也正是它名字的由来

       PhantomReference 唯一的用处就是跟踪 referent  何时被 enqueue 到 ReferenceQueue 中.  

       PhantomReference  有两个好处:

       其一, 它可以让我们准确地知道对象何时被从内存中删除, 这个特性可以被用于一些特殊的需求中(例如 Distributed GC,  XWork 和 google-guice 中也使用 PhantomReference 做了一些清理性工作).  

       其二, 它可以避免 finalization 带来的一些根本性问题, 上文提到 PhantomReference 的唯一作用就是跟踪 referent 何时被 enqueue 到 ReferenceQueue 中,  但是 WeakReference 也有对应的功能, 两者的区别到底在哪呢 ?

       这就要说到 Object 的 finalize 方法, 此方法将在 gc 执行前被调用, 如果某个对象重载了 finalize 方法并故意在方法内创建本身的强引用,  这将导致这一轮的 GC 无法回收这个对象并有可能

    引起任意次 GC, 最后的结果就是明明 JVM 内有很多 Garbage 却 OutOfMemory, 使用 PhantomReference 就可以避免这个问题, 因为 PhantomReference 是在 finalize 方法执行后回收的,也就意味着此时已经不可能拿到原来的引用,  也就不会出现上述问题,  当然这是一个很极端的例子, 一般不会出现.  

      

    Soft vs Weak vs Phantom References(taken from http://mindprod.com/jgloss/phantom.html)

    Type

    Purpose

    Use

    When GCed

    Implementing Class

    Strong Reference

    An ordinary reference. Keeps objects alive as long as they are referenced.

    normal reference.

    Any object not pointed to can be reclaimed.

    default

    Soft Reference

    Keeps objects alive provided there’s enough memory.

    to keep objects alive even after clients have removed their references (memory-sensitive caches), in case clients start asking for them again by key.

    After a first gc pass, the JVM decides it still needs to reclaim more space.

    java.lang.ref.SoftReference

    Weak Reference

    Keeps objects alive only while they’re in use (reachable) by clients.

    Containers that automatically delete objects no longer in use.

    After gc determines the object is only weakly reachable

    java.lang.ref.WeakReference 

    java.util.WeakHashMap

    Phantom Reference

    Lets you clean up after finalization but before the space is reclaimed (replaces or augments the use offinalize())

    Special clean up processing

    After finalization.

    java.lang.ref.PhantomReference

    参考自:http://www.javaeye.com/topic/401478

  • 相关阅读:
    浅析C#中的套接字编程
    在 C# 中通过 P/Invoke 调用Win32 DLL
    读书笔记c#高级编程 委托和事件
    如何将 .net framework 打包进 msi安装包,使得安装时自动安装
    自实现input上传指定文件到服务器
    Thrift初探:简单实现C#通讯服务程序
    C# 使用NLog记录日志
    C# winform程序怎么打包成安装项目(图解)
    VUE3.0+Vant VS Code入门教程
    WCF入门教程2——创建第一个WCF程序
  • 原文地址:https://www.cnblogs.com/hushaojun/p/4948434.html
Copyright © 2020-2023  润新知