专栏首页码农知识点Java的四种引用和回收策略

Java的四种引用和回收策略

参考: Java Reference详解 . 这篇讲的很清楚!!理解这些引用类型 注意一点,当JVM回收时,如果有回收引用队列queue,会把回收的referent加入到回收队列中。从而可实现对象回收时的通知,进行一定的工作。如WeakHashMap(用于回收key为null的entry) , DirectByteBuffer中的cleaner(用于回收堆外内存,因为堆外内存的回收不由JVM管理。) Java中的强引用,软引用,弱引用,虚引用有什么用?

《Effective Java》中正常是不建议使用这些引用Finalizer或者Cleaner来回收对象的,因为回收线程优先级不够高,回收不够及时,可能会导致严重的GC问题。如果想手动管理对象的回收,可以使类实现AutoCloseable接口,当需要释放对象的时候使客户端调用close方法。 弱引用的Java应用: ThreadLocal(ThreadLocalMap.Entry中key为弱引用,这样如果key为null的话,有些方法如resize会清空entry中的value,垃圾回收的时候就会回收该entry)

 static class ThreadLocalMap {

        /**
         * The entries in this hash map extend WeakReference, using
         * its main ref field as the key (which is always a
         * ThreadLocal object).  Note that null keys (i.e. entry.get()
         * == null) mean that the key is no longer referenced, so the
         * entry can be expunged from table.  Such entries are referred to
         * as "stale entries" in the code that follows.
         */
        static class Entry extends WeakReference<ThreadLocal<?>> {
            /** The value associated with this ThreadLocal. */
            Object value;

            Entry(ThreadLocal<?> k, Object v) {
                super(k);
                value = v;
            }
        }

WeakHashMap(key为弱引用的HashMap)

软引用的Java应用:

//Class中的缓存
   private volatile transient SoftReference<ReflectionData<T>> reflectionData;

    // Incremented by the VM on each call to JVM TI RedefineClasses()
    // that redefines this class or a superclass.
    private volatile transient int classRedefinedCount = 0;

    // Lazily create and cache ReflectionData
    private ReflectionData<T> reflectionData() {
        SoftReference<ReflectionData<T>> reflectionData = this.reflectionData;
        int classRedefinedCount = this.classRedefinedCount;
        ReflectionData<T> rd;
        if (useCaches &&
            reflectionData != null &&
            (rd = reflectionData.get()) != null &&
            rd.redefinedCount == classRedefinedCount) {
            return rd;
        }
        // else no SoftReference or cleared SoftReference or stale ReflectionData
        // -> create and replace new instance
        return newReflectionData(reflectionData, classRedefinedCount);
    }

其实SoftReference和WeakReference都经常用来作为缓存来使用,不过WeakReference更容易被清除而已。

Java的守护线程参考: 从Daemons到finalize timed out after 10 seconds

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 红黑树的原理和TreeMap实现

    红黑树是一种自平衡二叉查找树,它可以在O(logn)时间内做查找,插入和删除等操作,这使得它在实时应用中很有价值。可用来构造关联数组和集合,如Java中的Tre...

    Monica2333
  • Java线程中断

    首先,一个线程不应该由其他线程来强制中断或停止,而是应该由线程自己自行停止。所以,Thread.stop, Thread.suspend, Thread.res...

    Monica2333
  • zookeeper源码分析(3)— 一次会话的创建过程

    在一次会话的创建过程中,需要客户端首先发送创建会话请求,服务端集群创建会话成功后会将响应发送给客户端。

    Monica2333
  • AS3 内存回收机制

           AS3相对于以前版本的功能增强了很多,在赋予它重任时,同时也要它付出代价:垃圾收集器不再支持自动为你收集垃圾。本文中,我为大家整理了一些资料。首先...

    py3study
  • 【Leetcode】129.求根到叶子节点数字之和

    给定一个二叉树,它的每个结点都存放一个 0-9 的数字,每条从根到叶子节点的路径都代表一个数字。

    Leetcode名企之路
  • Java强引用、软引用、弱引用及虚引用深入探讨

    引用类型在日常开发中并不常关注,也很少注意到,因此很多人忽略了它们的存在,而事实上,引用类型在Java体系中扮演着十分重要的角色,要想对Java体系有一个更深层...

    弗兰克的猫
  • JVM&GC之java引用

    Java中的引用有点像C++中的指针,通过引用可以对堆中的对象进行操作。在Java程序中最常见的引用类型是强引用,也是默认的引用类型。当在Java语言中使用Ne...

    一觉睡到小时候
  • 什么样的对象需要被 GC ?

    上一篇文章 JVM 基本介绍 我们了解了一些基本的 JVM 知识,本篇开始逐步学习垃圾回收,我们都知道既然叫垃圾回收,那回收的就应该是垃圾,可是我们怎么知道哪些...

    周三不加班
  • 图解 Java 垃圾回收机制,写得非常好!

    自动垃圾回收是一种在堆内存中找出哪些对象在被使用,还有哪些对象没被使用,并且将后者删掉的机制。

    用户5224393
  • 垃圾回收器如何处理循环引用

    垃圾回收是一门编程语言中必不可少的一部分,不论是手动释放内存的C和C++,还是自动回收垃圾的Java和C#等语言。对于Java这样的语言,一般的开发者不强求关心...

    技术小黑屋

扫码关注云+社区

领取腾讯云代金券