JAVA-引用类型

JAVA有5中引用类型,strong,soft, weak,phantom,final

  1. 强引用: 最常用的引用,我们平常写的 XXX xxx = new XXX,没有引用时回收
  2. SoftReference:如果一个对象只剩下一个soft引用,在jvm内存不足的时候会将这个对象进行回收。队列中的 PhantomReference 的 referent 为空。回收之后放入队列
  3. WeakReference:如果对象只剩下一个weak引用,那gc的时候就会回收。官方说时用在规范化mapping。例如 WeakHashMap。队列中的 PhantomReference 的 referent 为空。回收之后放入队列
  4. PhantomReference(虚引用):就像它的名字一样形同虚设,与其他几种引用都不同,虚引用并不会决定对象的生命周期。gc时发送通知然后回收,主要用来在回收时处理一些逻辑,比如 Cleaner。队列中的 PhantomReference 的 referent 不为空。回收之前放入队列
  5. FinalReference (Finalizer):当重写 Object 的finalize() 方法后 JVM 会给该类添加 finalizer 标记,同时生成一个 FinalReference。主要用来调用 finalize() 方法,通过使用低优先级的守护线程实现对 finalize() 的调用,该类被回收至少需要经过2次GC,第一次是将 FinalReference 放入ReferenceQueue 供 Finalizer 的守护线程使用(即调用 finalize()),第二次才能被回收。这里有个问题就是 Finalizer 的 守护线程不知道什么时候会被调用,所以这些对象可能一直会被回收,导致oom

SoftReference和WeakReference 都可以用来做缓存,只是生命周期不一样。

参考:
https://www.infoq.cn/article/jvm-source-code-analysis-finalreference/
https://www.jianshu.com/p/e66930caca9c
https://www.jianshu.com/p/fdd4c16601f9

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 感知GC。怎么感知:* 通过get来判断已经被GC(PhantomReference 在任何时候get都是null...
    YDDMAX_Y阅读 1,987评论 0 4
  • JDK1.2之后,Java扩充了引用的概念,将引用分为强引用、软引用、弱引用和虚引用四种。 强引用类似于”Obje...
    lesline阅读 4,981评论 0 0
  • Java引用概述 StrongReference(强引用) 不存在这个类 默认实现 Java.lang.ref提供...
    Gxgeek阅读 566评论 0 2
  • 强引用 ( Strong Reference ) 强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝...
    tomas家的小拨浪鼓阅读 3,137评论 1 4
  • 2019——深耕DevOps 经过3年的推广,DevOps在大部分项目得到使用,完成了从0到1的过程。在此...
    AI时代原住民阅读 314评论 0 2

友情链接更多精彩内容