java引用:强软弱虚

java引用:强软弱虚

public static void main(String[] args) throws IOException {
        /**
         * 强引用:默认的引用。只要有引用指向这个对象,垃圾回收一定不会回收他
         */
        User user = new User();

        //使user不在指向他,此时调用垃圾回收System.gc();可以回他
        user = null;

        System.gc();

        System.in.read();

        /**
         * 软引用:当一个对象u被一个软引用指向的时候,只有系统内存不够用时,才会回收他
         */
        SoftReference<User> user2 = new SoftReference<>(new User());


        /**
         * 弱引用:只要遇到垃圾回收,一定会被回收(多使用在容器里)
         * 当一个强引用也指向这个对象的时候,如果强引用消失,那么这个弱引用也将自动消失
         */
        WeakReference<User> user3 = new WeakReference<>(new User());

        /**
         * ThreadLocal的set的时候,就是往当前线程的ThreadLocalMap里添加
         * key就是ThreadLocal本身,value就是set的值
         * 这里的key就是通过弱引用指向的ThreadLocal对象
         *
         * 如果threadLocal这个强引用不在指向ThreadLocal,那么ThreadLocalMap中
         * 的key这个弱引用指向的ThreadLocal的关系也将消失(防止内存泄漏)
         *
         * 如果这个key不是弱引用,则key的引用关系将一直存在,ThreadLocal对象不会被回收(内存泄漏)
         *
         * !!!!!!!!!!!!!!!!!!!!!!!!
         * 即使ThreadLocal对象被回收,但还是有内存泄漏的存在。
         * 因为此时key变为null,导致所有value再也无法被访问到。
         * 所以,使用ThreadLocal时,里面对象不用时,务必threadLocal.remove()
         */
        ThreadLocal<User> threadLocal = new ThreadLocal<>();
        threadLocal.set(new User());
        threadLocal.remove();


        /**
         * 虚引用:当对象被回收时,通过Queue可以检测到,然后清理堆外内存
         */
        ReferenceQueue<User> queue = new ReferenceQueue<>();
        PhantomReference<User> phantomReference = new PhantomReference<>(new User(),queue);
    }

发布了48 篇原创文章 · 获赞 1 · 访问量 2825

猜你喜欢

转载自blog.csdn.net/Forest24/article/details/101696374
今日推荐