Java 強軟弱虛 引用

強引用 :

A a = new A () ; 

這就是強引用,只有a = null 或者a 不在指向堆中的 a 對象, a對象纔會被jvm 回收

軟引用 :

當內存容量不夠時,隨時可能被回收,當內存容量足夠的時候不會被回收的一種引用.主要用來做緩存使用.

比如
public static void main(String[] args) {
        // -Xmx20M jvm 分配20M運行內存
        SoftReference<byte[]> demo = new SoftReference<>(new byte[1024 * 1024 * 10]);
        System.out.println(demo.get());
        System.gc();
        try {
            TimeUnit.MILLISECONDS.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(demo.get());
        // 在分配15M內存,這個時候, 軟引用就會被回收
        byte[] bb = new byte[1024 * 1024 * 15];

        System.out.println(demo.get());
    }

先分配一個10M的byte[],使用的是軟引用,當後面再分配一個15M的內存的時候,軟引用就會被回收

運行結果:

[B@515f550a
[B@515f550a
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
	at com.improve.soft.T_SoftReference.main(T_SoftReference.java:20)

理論結果應該是:

[B@515f550a
[B@515f550a
null

(這個沒驗證成功,會發生OOM,但是如果把內存調至25或者以上的時候,纔會被回收.馬士兵的視頻是這麼講解和驗證的,姑且先這麼理解,如果有知道原因的,歡迎評論.)

這裏面的byte[] 就是一個軟引用

 

弱引用:

當垃圾回收時, 不管內存空間是否充足,都會被回收弱引用對象

public static void main(String[] args) {
        WeakReference<Demo> demo = new WeakReference<>(new Demo());
        System.out.println(demo.get()); // com.improve.Demo@515f550a
        System.gc();
        System.out.println(demo.get());  // null

    }

TreadLocal中使用的就是弱引用

虛引用:

這個引用有跟沒有一樣,隨時都可能被回收,不影響對象的生命週期,主要用來監控對象被垃圾回收活動,與軟引用和弱引用的區別時,虛引用必須和引用隊列(ReferenceQueue)一起使用.一般用於直接內存操作的對象(NIO, Netty zore copy 使用到)

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章