亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

java中的引用類型之強(qiáng)軟弱虛詳解

 更新時(shí)間:2020年06月14日 10:54:06   作者:Kevin_zheng  
這篇文章主要給大家介紹了關(guān)于java中引用類型之強(qiáng)軟弱虛的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

前言

java中的引用類型共4種:強(qiáng)軟弱虛,具體每種類型的特點(diǎn)和應(yīng)用場(chǎng)景。記錄下。本文是看了馬士兵老師的視頻后記錄整理的。加深印象。

基本概念

1. 強(qiáng)引用

強(qiáng)引用是使用最普遍的引用。如果一個(gè)對(duì)象具有強(qiáng)引用,那垃圾回收器絕不會(huì)回收它。當(dāng)內(nèi)存空間不足時(shí),Java虛擬機(jī)寧愿拋出OutOfMemoryError錯(cuò)誤,使程序異常終止,也不會(huì)靠隨意回收具有強(qiáng)引用的對(duì)象來(lái)解決內(nèi)存不足的問(wèn)題。

顯式地設(shè)置M對(duì)象為null,或讓其超出對(duì)象的生命周期范圍,則gc認(rèn)為該對(duì)象不存在引用,這時(shí)就可以回收這個(gè)對(duì)象
示例代碼

聲明一個(gè)M類

public class M {

 /**
  * 當(dāng)這個(gè)對(duì)象會(huì)被回收的時(shí)候,finalize會(huì)被調(diào)用
  *
  * @throws Throwable
  */
 @Override
 protected void finalize() throws Throwable {
  System.out.println("finalize");
 }
}

強(qiáng)引用調(diào)用

public class NormalReference {

 public static void main(String[] args) throws IOException {
  M m = new M();
  m = null;
  System.gc();

  // 如果不寫 main方法退出。System.gc()在垃圾回收線程里;
  // 有可能還沒(méi)來(lái)得及回收main方法就退出了
  System.in.read();
 }
}

輸出結(jié)果

finalize

2. 軟引用

軟引用對(duì)象是在jvm內(nèi)存不夠的時(shí)候才會(huì)被回收

代碼示例

public class Soft {

  public static void main(String[] args) {
    System.out.println(Runtime.getRuntime().totalMemory() / 1024 / 1024);
    //10m
    SoftReference<byte[]> m = new SoftReference<>(new byte[1024 * 1024 * 10]);

    System.out.println(m.get());
    System.gc();
    try {
      Thread.sleep(1500);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    System.out.println(m.get());

    // 再分配一個(gè)數(shù)組,heap裝不下去,這時(shí)候系統(tǒng)會(huì)垃圾回收,
    // 先回收一次,如果不夠,會(huì)把軟引用回收
    byte[] b = new byte[1024 * 1024 * 11];

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

設(shè)置程序運(yùn)行參數(shù): -Xmx20M

運(yùn)行結(jié)果

19
[B@1540e19d
[B@1540e19d
null

我們可以看到,這個(gè)時(shí)候已經(jīng)被回收了。

應(yīng)用場(chǎng)景:軟引用時(shí)候做緩存

3. 弱引用

弱引用與軟引用的區(qū)別在于:只具有弱引用的對(duì)象擁有更短暫的生命周期。在垃圾回收器線程掃描它所管轄的內(nèi)存區(qū)域的過(guò)程中,一旦發(fā)現(xiàn)了只具有弱引用的對(duì)象,不管當(dāng)前內(nèi)存空間足夠與否,都會(huì)回收它的內(nèi)存

代碼示例

public class Weak {

  public static void main(String[] args) {
    WeakReference<M> m = new WeakReference<>(new M());

    System.out.println(m.get());
    System.gc();
    System.out.println(m.get());
  }
}

執(zhí)行結(jié)果

M@1540e19d
null
finalize

4. 虛引用

如果一個(gè)對(duì)象僅持有虛引用,那么它就和沒(méi)有任何引用一樣,在任何時(shí)候都可能被垃圾回收器回收。
虛引用必須和引用隊(duì)列(ReferenceQueue)聯(lián)合使用。當(dāng)垃圾回收器準(zhǔn)備回收一個(gè)對(duì)象時(shí),如果發(fā)現(xiàn)它還有虛引用,就會(huì)在回收對(duì)象的內(nèi)存之前,把這個(gè)虛引用加入到與之關(guān)聯(lián)的引用隊(duì)列中。

示例

public class Phantom {

  private static final List<Object> LIST = new LinkedList<>();
  private static final ReferenceQueue<M> QUEUE = new ReferenceQueue<>();

  public static void main(String[] args) {
    PhantomReference<M> phantomReference = new PhantomReference<>(new M(), QUEUE);

    new Thread(
        () -> {
          while (true) {
            LIST.add(new byte[1024 * 1024]);
            try {
              Thread.sleep(1000);
            } catch (InterruptedException e) {
              Thread.currentThread().interrupt();
            }
            System.out.println(phantomReference.get());
          }

        }

    ).start();

    new Thread(() -> {
      while (true) {
        Reference<? extends M> poll = QUEUE.poll();
        if (poll != null) {
          System.out.println("-------虛引用對(duì)象被jvm回收了------" + poll);
        }
      }
    }).start();
  }
}

運(yùn)行結(jié)果

finalize
null
Exception in thread "Thread-0" java.lang.OutOfMemoryError: Java heap space
 at Phantom.lambda$main$0(Phantom.java:18)
 at Phantom$$Lambda$1/1078694789.run(Unknown Source)
 at java.lang.Thread.run(Thread.java:748)
-------虛引用對(duì)象被jvm回收了------java.lang.ref.PhantomReference@688ee48d

應(yīng)用場(chǎng)景:堆外內(nèi)存的管理

總結(jié)

到此這篇關(guān)于java中引用類型之強(qiáng)軟弱虛的文章就介紹到這了,更多相關(guān)java引用類型之強(qiáng)軟弱虛內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java基礎(chǔ)之二叉搜索樹的基本操作

    Java基礎(chǔ)之二叉搜索樹的基本操作

    發(fā)現(xiàn)許多小伙伴還不清楚Java二叉搜索樹的基本操作,今天特地整理了這篇文章,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)Java的小伙伴很有幫助,需要的朋友可以參考下
    2021-05-05
  • Java內(nèi)部類的實(shí)現(xiàn)原理與可能的內(nèi)存泄漏說(shuō)明

    Java內(nèi)部類的實(shí)現(xiàn)原理與可能的內(nèi)存泄漏說(shuō)明

    這篇文章主要介紹了Java內(nèi)部類的實(shí)現(xiàn)原理與可能的內(nèi)存泄漏說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-10-10
  • spring聲明式事務(wù)解析

    spring聲明式事務(wù)解析

    這篇文章主要為大家詳細(xì)介紹了spring聲明式事務(wù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • linux下執(zhí)行java程序的sh腳本分享

    linux下執(zhí)行java程序的sh腳本分享

    這篇文章主要介紹了linux下執(zhí)行java程序的sh腳本,僅供參考,但是設(shè)置的時(shí)候環(huán)境變量是最重要的,我就是環(huán)境變量一直不對(duì),總是按網(wǎng)上查到的來(lái),不明白怎么回事,才一直出錯(cuò),其實(shí)環(huán)境變量就是你要執(zhí)行的java程序所在的位置
    2014-09-09
  • java項(xiàng)目中讀取jdbc.properties文件操作

    java項(xiàng)目中讀取jdbc.properties文件操作

    這篇文章主要介紹了java項(xiàng)目中讀取jdbc.properties文件操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-08-08
  • JAVA開發(fā)常用類庫(kù)UUID、Optional、ThreadLocal、TimerTask、Base64使用方法與實(shí)例詳解

    JAVA開發(fā)常用類庫(kù)UUID、Optional、ThreadLocal、TimerTask、Base64使用方法與實(shí)例詳

    這篇文章主要介紹了JAVA開發(fā)常用類庫(kù)UUID、Optional、ThreadLocal、TimerTask、Base64使用方法與實(shí)例詳解,需要的朋友可以參考下
    2020-02-02
  • IDEA社區(qū)版創(chuàng)建spring boot項(xiàng)目的安裝插件的圖文教程

    IDEA社區(qū)版創(chuàng)建spring boot項(xiàng)目的安裝插件的圖文教程

    這篇文章主要介紹了IDEA社區(qū)版創(chuàng)建spring boot項(xiàng)目的安裝插件,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • java連接SQL?Server數(shù)據(jù)庫(kù)的超詳細(xì)教程

    java連接SQL?Server數(shù)據(jù)庫(kù)的超詳細(xì)教程

    最近在java連接SQL數(shù)據(jù)庫(kù)時(shí)會(huì)出現(xiàn)一些問(wèn)題,所以這篇文章主要給大家介紹了關(guān)于java連接SQL?Server數(shù)據(jù)庫(kù)的超詳細(xì)教程,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • Netty粘包拆包及使用原理詳解

    Netty粘包拆包及使用原理詳解

    Netty是由JBOSS提供的一個(gè)java開源框架,現(xiàn)為?Github上的獨(dú)立項(xiàng)目。Netty提供異步的、事件驅(qū)動(dòng)的網(wǎng)絡(luò)應(yīng)用程序框架和工具,用以快速開發(fā)高性能、高可靠性的網(wǎng)絡(luò)服務(wù)器和客戶端程序,這篇文章主要介紹了Netty粘包拆包及使用原理
    2022-08-08
  • Spring Boot(五)之跨域、自定義查詢及分頁(yè)

    Spring Boot(五)之跨域、自定義查詢及分頁(yè)

    這篇文章主要介紹了Spring Boot(五)之跨域、自定義查詢及分頁(yè)的的相關(guān)資料,需要的朋友可以參考下
    2017-04-04

最新評(píng)論