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());
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM