欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

分享JVM 的四種引用方式

 更新時間:2022年07月08日 08:42:05   作者:cao_xiaobo  
這篇文章主要介紹了分享JVM 的四種引用方式,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,需要的小伙伴可以參考一下

前言

Java中提供這四種引用類型主要有兩個目的:

  • 可以讓程序員通過代碼的方式決定某些對象的生命周期;
  • 有利于JVM進行垃圾回收

java.lang.ref包下的引用類結構圖:

一、強引用

特點:GC時,永遠不會被回收

是指創(chuàng)建一個對象并把這個對象賦給一個引用變量。

比如:

Object object = new Object();
String str = "hello"

強引用有引用變量指向時永遠不會被垃圾回收,JVM寧愿拋出OutOfMemory錯誤也不會回收這種對象。

public void fun1() {
    Object object = new Object();
    Object[] objArr = new Object[1000];
}

當運行至Object[] objArr = new Object[1000];這句時,如果內存不足,JVM會拋出OOM錯誤也不會回收object指向的對象。不過要注意的是,當fun1運行完之后,object和objArr都已經不存在了,所以它們指向的對象都會被JVM回收。

如果想中斷強引用和某個對象之間的關聯(lián),可以顯示地將引用賦值為null,這樣一來的話,JVM在合適的時間就會回收該對象。比如Vector類的clear方法中就是通過將引用賦值為null來實現(xiàn)清理工作的

強引用也是導致內存泄露的主要原因

二、軟引用

特點:內存不足時(自動觸發(fā)GC),會被回收

如果一個對象具有軟引用,內存空間足夠,垃圾回收器就不會回收它;如果內存空間不足了,就會回收這些對象的內存。只要垃圾回收器沒有回收它,該對象就可以被程序使用。軟引用可用來實現(xiàn)內存敏感的高速緩存,比如網(wǎng)頁緩存、圖片緩存等。使用軟引用能防止內存泄露,增強程序的健壯性。

SoftReference的特點是它的一個實例保存對一個Java對象的軟引用, 該軟引用的存在不妨礙垃圾收集線程對該Java對象的回收。也就是說,一旦SoftReference保存了對一個Java對象的軟引用后,在垃圾線程對 這個Java對象回收前,SoftReference類所提供的get()方法返回Java對象的強引用。另外,一旦垃圾線程回收該Java對象之 后,get()方法將返回null。

示例:

JVM參數(shù) -Xms10m -Xmx10m -XX:+PrintGCDetails

public static void main(String[] args) {
    Object obj = new Object();
    SoftReference<Object> softRef = new SoftReference<Object>(obj);
    System.out.println(obj);
    System.out.println(softRef.get());
    // 對象要設置為null,否則不會被回收。原因:通過設置為null讓對象失去引用,方便GC
    // 備注:因為在這個main方法中(主線程),方法未結束之前,不設置為null,對象是不會失去引用的。
    obj = null;
    // 當內存不足時,會自動觸發(fā)GC操作,這里就無需手動GC
    try {
        byte[] b = new byte[30 * 1024 * 1024];
    } catch (Exception e) {
        // TODO: handle exception
    } finally {
        System.out.println(obj);
        System.out.println(softRef.get());
    }
}

上述示例說明,軟引用在內存不夠時,通過系統(tǒng)的GC,回收對象了

假如有一個應用需要讀取大量的本地圖片:

  • 如果每次讀取圖片都從硬盤中讀取則會嚴重影響性能
  • 如果一次全部加載到內存中又可能會造成內存溢出

此時使用軟引用可以解決這個問題。

設計思路:用一個HashMap來保存圖片的路徑的相應圖片對象關聯(lián)的軟引用之間的映射關系,在內存不足時,JVM會自動回收這些緩存圖片對象所占用的空間,從而有效地避免OOM的問題。

Map<String, SoftRefrence<Bitmap>> imageCache = new HashMap<String, SoftRefrence<Bitmap>>();

三、弱引用

特點:無論內存是否充足,只要進行GC,都會被回收

引用也是用來描述非必需對象的,當JVM進行垃圾回收時,無論內存是否充足,都會回收被弱引用關聯(lián)的對象。在java中,用java.lang.ref.WeakReference類來表示

示例:

public static void main(String[] args) {
    Object obj = new Object();
    WeakReference<Object> weakRef = new WeakReference<Object>(obj);
    System.out.println(obj);            // java.lang.Object@7852e922
    System.out.println(weakRef.get());    // java.lang.Object@7852e922
    // 對象要設置為null,否則不會被回收。原因:通過設置為null讓對象失去引用,方便GC
    // 備注:因為在這個main方法中(主線程),方法未結束之前,不設置為null,對象是不會失去引用的。
    obj = null;
    // 這里通過手動觸發(fā)GC操作。否則內存充足的情況下很難自動觸發(fā)GC
    System.gc();

    System.out.println(obj);            // null
    System.out.println(weakRef.get());    // null
}

上述示例表明,在內存充足的情況下,弱引用的對象也被回收了。

WeakHashMap的用法

public static void main(String[] args) {
    WeakHashMap<String, String> weakMap = new WeakHashMap<String, String>();
    String key = "1";
    weakMap.put(key, "test");
    System.out.println(weakMap);            // {1=test}
    System.out.println(weakMap.get(key));    // test

    key = null;
    System.gc();
    System.out.println(weakMap);            // {1=test}
    System.out.println(weakMap.get(key));    // null
}

軟引用和弱引用的使用場景:mybatis中的緩存

四、虛引用

特點:如同虛設,和沒有引用沒什么區(qū)別

虛引用和前面的軟引用、弱引用不同,它并不影響對象的生命周期。在java中用java.lang.ref.PhantomReference類表示。如果一個對象與虛引用關聯(lián),則跟沒有引用與之關聯(lián)一樣,在任何時候都可能被垃圾回收器回收。

要注意的是,虛引用必須和引用隊列關聯(lián)使用,當垃圾回收器準備回收一個對象時,如果發(fā)現(xiàn)它還有虛引用,就會把這個虛引用加入到與之關聯(lián)的引用隊列中。程序可以通過判斷引用隊列中是否已經加入了虛引用,來了解被引用的對象是否將要被垃圾回收。如果程序發(fā)現(xiàn)某個虛引用已經被加入到引用隊列,那么就可以在所引用的對象的內存被回收之前采取必要的行動。

示例:

public static void main(String[] args) {
    Object obj = new Object();
    ReferenceQueue<String> queue = new ReferenceQueue<String>();  
    PhantomReference<String> pr = new PhantomReference<String>(obj, queue);  
    System.out.println(pr.get());  // null
}

虛引用的主要作用是跟蹤對象被垃圾回收的狀態(tài)。僅僅是提供了一種確保對象被finalize以后,做某些事情的機制。PhantomRefrence的get方法總是返回null,因此無法訪問對應的引用對象。其意義在于說明一個對象已經進入finalization階段,可以被GC回收,用來實現(xiàn)比finalization機制更靈活的回收操作。

換句話說,設置虛引用關聯(lián)的唯一目的,就是在這個對象被收集器回收的時候收到一個系統(tǒng)通知或者后續(xù)添加進一步的處理。Java技術允許使用finalize()方法在垃圾收集器將對象從內存中清除之前做必要的清理工作。

引用隊列的用法

public static void main(String[] args) {
    Object obj = new Object();
    ReferenceQueue<Object> queue = new ReferenceQueue<Object>();  
    WeakReference<Object> weakRef = new WeakReference<Object>(obj, queue);  
    System.out.println(obj);             // java.lang.Object@7852e922
    System.out.println(weakRef.get());  // java.lang.Object@7852e922
    System.out.println(queue.poll());      // null

    obj = null;
    System.gc();

    System.out.println(obj);             // null
    System.out.println(weakRef.get());  // null
    System.out.println(queue.poll());     // java.lang.ref.WeakReference@4e25154f
}

到此這篇關于分享JVM 的四種引用方式的文章就介紹到這了,更多相關JVM 引用方式內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • spring @Scheduled注解的使用誤區(qū)及解決

    spring @Scheduled注解的使用誤區(qū)及解決

    這篇文章主要介紹了spring @Scheduled注解的使用誤區(qū)及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • spring cloud 分布式鏈路追蹤的方法

    spring cloud 分布式鏈路追蹤的方法

    這篇文章主要介紹了spring cloud 分布式鏈路追蹤的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • Java中Synchronized鎖的使用和原理詳解

    Java中Synchronized鎖的使用和原理詳解

    這篇文章主要介紹了Java中Synchronized鎖的使用和原理詳解,synchronized是?Java?內置的關鍵字,它提供了一種獨占的加鎖方式,synchronized的獲取和釋放鎖由JVM實現(xiàn),用戶不需要顯示的釋放鎖,非常方便,需要的朋友可以參考下
    2023-07-07
  • SpringBoot使用GTS的示例詳解

    SpringBoot使用GTS的示例詳解

    這篇文章主要介紹了SpringBoot使用GTS的示例詳解,代碼簡單易懂,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-10-10
  • Kotlin lateinit與by lazy案例詳解

    Kotlin lateinit與by lazy案例詳解

    這篇文章主要介紹了Kotlin lateinit與by lazy案例詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-09-09
  • JavaEE Filter敏感詞過濾的方法實例詳解

    JavaEE Filter敏感詞過濾的方法實例詳解

    我們無論是在聊天還是在留言時,都有一些信息不希望別人看到。那么如果過濾這些關鍵詞呢?下面小編給大家分享JavaEE Filter敏感詞過濾的方法實例詳解,感興趣的朋友一起學習吧
    2016-05-05
  • Java數(shù)組添加元素的兩種方法

    Java數(shù)組添加元素的兩種方法

    這篇文章主要介紹了Java數(shù)組添加元素的兩種方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友跟著小編來一起學習學習吧
    2023-04-04
  • spring boot配置MySQL數(shù)據(jù)庫連接、Hikari連接池和Mybatis的簡單配置方法

    spring boot配置MySQL數(shù)據(jù)庫連接、Hikari連接池和Mybatis的簡單配置方法

    這篇文章主要介紹了spring boot配置MySQL數(shù)據(jù)庫連接、Hikari連接池和Mybatis的簡單配置方法,需要的朋友可以參考下
    2018-03-03
  • SpringBoot配置log4j2的實現(xiàn)示例

    SpringBoot配置log4j2的實現(xiàn)示例

    SpringBoot中默認使用Logback作為日志框架,本文主要介紹了SpringBoot配置log4j2的實現(xiàn)示例,具有一定的參考價值,感興趣的可以了解一下
    2023-12-12
  • BeanUtils.copyProperties()參數(shù)的賦值順序說明

    BeanUtils.copyProperties()參數(shù)的賦值順序說明

    這篇文章主要介紹了BeanUtils.copyProperties()參數(shù)的賦值順序說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09

最新評論