• JVM 引用类型


    1、强引用

    强引用,是在我们的开发工作当中普遍存在的。如果一个对象具有强引用,那就类似我们经常穿的衣服啊等必不可少的生活用品,我们肯定不会把他扔掉,同样jvm的垃圾回收器也不会回收它。当内存空间不足的时候,java虚拟机宁可抛出OOM异常,也不会回收具有强引用的对象来释放内存。我们可以将对象显示的赋值为null,则gc认为该对象不存在引用,这时就可以回收这个对象。具体什么时候收集这要取决于gc的算法。也就是说方法的内部有一个强引用,这个引用保存在栈中,而真正的引用内容(Object)保存在堆中。当这个方法运行完成后就会退出方法栈,则引用内容的引用不存在,这个Object会被回收。

     

    2、软引用

     SoftReference:是比强引用弱化的引用,可以让对象豁免一些垃圾回收,软引用通常在对内存比较敏感的程序中,例如高速缓存区,mybatis就是用到了该方式。他的特点就是 存充足的时候不被回收,内存不足时才被回收。 

     

    package com.jalja.java.reference;
    
    import java.lang.ref.SoftReference;
    
    /**
     * @Auther: XL
     * @Date: 2019/12/24 07:50
     * @Description:
     */
    public class SoftReferenceTest {
        public static void main(String [] args) throws Exception{
            //softReferenceAmple();
            softReferenceNotAmple();
        }
    
        /**
         * 内存充足
         */
        private static void  softReferenceAmple(){
            Object o=new Object();
            SoftReference<Object> reference=new SoftReference<>(o);
            System.out.println(o);
            System.out.println(reference.get());
    
            o=null;
            System.gc();
            System.out.println(o);
            System.out.println(reference.get());
        }
    
        /**
         * 内存不足就回收
         */
        private static void  softReferenceNotAmple(){
            Object o=new Object();
            SoftReference<Object> reference=new SoftReference<>(o);
            System.out.println(o);
            System.out.println(reference.get());
            o=null;
            try {
                byte[]bytes=new byte[30*1024*1024];
            }finally {
                System.out.println(o);
                System.out.println(reference.get());
            }
        }
    }
    View Code

    3、弱引用

     WeakReference:无论内存是否足够,只要发生GC 弱引用的对象一定被回收

    package com.jalja.java.reference;
    
    import java.lang.ref.SoftReference;
    import java.lang.ref.WeakReference;
    import java.util.WeakHashMap;
    
    /**
     * @Auther: XL
     * @Date: 2019/12/24 08:02
     * @Description:
     */
    public class WeakReferenceTest {
        public static void main(String [] args) throws Exception{
            weakReferenceTest();
        }
    
        /**
         * 内存充足
         */
        private static void weakReferenceTest(){
            Object o=new Object();
            WeakReference<Object> reference=new WeakReference<>(o);
            System.out.println(o);
            System.out.println(reference.get());
    
            o=null;
            System.gc();
            System.out.println("==========GC=========");
            System.out.println(o);
            System.out.println(reference.get());
        }
        private static void weakHashMapTest(){
            WeakHashMap<String,Object> weakHashMap=new WeakHashMap<>();
    
        }
    }
    View Code

     WeakHashMap:

    4、虚引用

     PhantomReference:

        public static void main(String [] args) throws Exception{
            Object o=new Object();
            ReferenceQueue<Object> queue=new ReferenceQueue();
            PhantomReference<Object> reference=new PhantomReference<>(o,queue);
            System.out.println(o);
            System.out.println(reference.get());
            System.out.println(queue.poll());
    
            o=null;
            System.gc();
            System.out.println("==========GC=========");
            System.out.println(o);
            System.out.println(reference.get());
            System.out.println(queue.poll());
        }

    引用队列:ReferenceQueue

     

    package com.jalja.java.reference;
    
    import java.lang.ref.ReferenceQueue;
    import java.lang.ref.WeakReference;
    
    /**
     * @Auther: XL
     * @Date: 2019/12/24 08:28
     * @Description: ReferenceQueue 引用队列,在GC后悔保留对象的引用
     */
    public class ReferenceQueueTest {
        public static void main(String [] args) throws Exception{
            Object o=new Object();
            ReferenceQueue<Object> queue=new ReferenceQueue();
            WeakReference<Object> reference=new WeakReference<>(o,queue);
            System.out.println(o);
            System.out.println(reference.get());
            System.out.println(queue.poll());
    
            o=null;
            System.gc();
            System.out.println("==========GC=========");
            System.out.println(o);
            System.out.println(reference.get());
            System.out.println(queue.poll());
        }
    }
  • 相关阅读:
    .net项目的svn Global ignore pattern
    Ionic开发中常见问题和解决方案记录
    iOS开发:mac使用svn管理项目
    iOS开发:本地数据存储-NSUserDefaults
    iOS开发:插件记录
    iOS开发:告诉git不要跟踪UserInterfaceState.xcuserstate
    发布 windows 10 universal app 时微软账号验证失败
    iOS开发:UINavigationController常用操作
    iOS开发:Swift多线程NSOperation的使用
    iOS开发:Swift多线程GCD的使用
  • 原文地址:https://www.cnblogs.com/jalja/p/12057700.html
Copyright © 2020-2023  润新知