Java四种应用

2024-12-17  本文已影响0人  Owen270

1.强应用

不会轻易被GC回收,除非不在任一一个以GC Root为起点的引用链中.

Object obj=new Object();

2.软引用

只有在内存不足的时候,软引用才会被回收.

  public static void testSoftReference(){
        User user=new User("Owen",18);
        SoftReference<User> reference=new SoftReference<>(user);
        user=null;
        System.out.println("user为null,软引用依旧不会被回收 :"+reference.get());
        System.gc();
        System.out.println("GC之后,如果内存够用,软引用还是不会被回收:"+reference.get());
        //向堆中填充数据,导致OOM
        List<byte[]> list=new LinkedList<>();
        try{
            for(int i=0;i<100;i++){
                System.out.println("for==========:"+reference.get());
                list.add(new byte[1024*1024*1024*1]);
            }
        }catch (Exception e){
            System.out.println("Exception:"+reference.get());
        }
    }

3.弱引用

在GC回收的时候,弱引用会被回收

 public static void testWeakReference(){
        User user=new User("Owen",18);
        WeakReference<User> reference=new WeakReference<>(user);
        user=null;
        System.out.println("user为null,弱引用依旧不会被回收 :"+reference.get());
        System.gc();
        System.out.println("GC之后,弱引用被GC回收:"+reference.get());
    }

4.虚引用

用于监听GC回收,判断给引用是否被垃圾回收。
当引用被垃圾回收时,该引用的对象被添加到ReferenceQueue中,如果引用队列队头元素不为null,表示应用已经被GC回收了。

 public static void testPhantomReference()  {
        try {
            //虚引用:功能,不会影响到对象的生命周期的,
            // 但是能让程序员知道该对象什么时候被 回收了
            ReferenceQueue<Object> referenceQueuee=new ReferenceQueue<Object>();
            Object phantomObject=new Object();
            //虚引用需要配合引用队列才能看到效果
            PhantomReference phantomReference  =new 
            PhantomReference(phantomObject,referenceQueuee);
            phantomObject=null;//方便进行垃圾回收
            System.out.println("phantomObject:"+phantomReference.get());//输出null
            System.out.println("phantomReference:"+referenceQueuee.poll());//输出null
            System.gc();//phantomObject被回收之后,会被加入到引用队列中
            Thread.sleep(2000);
            //从引用队列的队头获取元素
            System.out.println("referenceQueue:"+referenceQueuee.poll() );//输出GC回收的对象
        }catch (Exception e){
            System.out.println("exception:"+e.toString());
        }
    }
上一篇 下一篇

猜你喜欢

热点阅读