最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

spring啟動后保證創(chuàng)建的對象不被垃圾回收器回收

 更新時間:2016年09月30日 16:14:52   投稿:daisy  
最近看到一個問題是,spring在啟動后如何保證創(chuàng)建的對象不被垃圾回收器回收?。所以本文結(jié)合jvm的垃圾回收機制和spring中的源代碼做出自己的一點猜測。有需要的朋友們可以參考借鑒。

一、可達性分析(根搜索)算法

JVM通過可達性分析來判定對象是否存活。這個算法的基本思路就是通過一系列稱為GC Roots的對象作為起始點,從這些節(jié)點開始向下搜索,搜索所走過的路徑稱為引用鏈,當一個對象到GC Roots沒有任何引用鏈相連時,則證明此對象是不可用的。如下圖中對象object1、object2、object3、object4是可用的對象,object5、object6、object7雖然互相關(guān)聯(lián),但是它們到GC Roots是不可達的,所以它們將會被判定為是可回收的對象。

在Java語言中,可作為GC Roots的對象包括下面幾種:

     1、虛擬機棧(棧幀中的本地變量)中引用的對象。

     2、方法區(qū)中類靜態(tài)屬性引用的對象。

     3、方法區(qū)中常量引用的對象。

     4、本地方法棧中JNI(Native方法)引用的對象。

二、spring源代碼

spring創(chuàng)建對象是通過實現(xiàn)接口BeanFactory的類來實現(xiàn)的,有如下的實現(xiàn)結(jié)構(gòu):

SimpleJndiBeanFactory.java

public class SimpleJndiBeanFactory extends JndiLocatorSupport implements BeanFactory {
  private final Set<String> shareableResources = new HashSet();
  //使用new創(chuàng)建的map,是棧中引用的對象,可作為GC Roots 對象
  private final Map<String, Object> singletonObjects = new HashMap();
  private final Map<String, Class<?>> resourceTypes = new HashMap();
  public SimpleJndiBeanFactory() {
    this.setResourceRef(true);
  }
  public void addShareableResource(String shareableResource) {
    this.shareableResources.add(shareableResource);
  }
  public void setShareableResources(String... shareableResources) {
    this.shareableResources.addAll(Arrays.asList(shareableResources));
  }
  public Object getBean(String name) throws BeansException {
    return this.getBean(name, Object.class);
  }
}

StaticListableBeanFactory.java

public class StaticListableBeanFactory implements ListableBeanFactory {
  private final Map<String, Object> beans;
  public StaticListableBeanFactory() {
    //使用new創(chuàng)建的map,是棧中引用的對象,可作為GC Roots 對象
    this.beans = new LinkedHashMap();
  }
  public StaticListableBeanFactory(Map<String, Object> beans) {
    Assert.notNull(beans, "Beans Map must not be null");
    this.beans = beans;
  }
  public void addBean(String name, Object bean) {
    this.beans.put(name, bean);
  }
}

從上面的源代碼可以看出,對象存放在一個Map中,其中mapsingletonObjects是用來存放單例對象的。map singletonObjectsbeans(在構(gòu)造方法中new)都是直接使用關(guān)鍵字new創(chuàng)建,是強引用,滿足作為GC Roots對象的條件(虛擬機棧(棧幀中的本地變量)中引用的對象)。這樣創(chuàng)建的對象存在map中和GC Roots對象相連,所以不會被回收。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。

相關(guān)文章

  • SSM框架搭建圖文教程(推薦)

    SSM框架搭建圖文教程(推薦)

    下面小編就為大家?guī)硪黄猄SM框架搭建圖文教程(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • 詳解JavaEE中Apollo安裝使用小結(jié)

    詳解JavaEE中Apollo安裝使用小結(jié)

    這篇文章主要介紹了詳解JavaEE中Apollo安裝與使用,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03
  • 淺談servlet與jsp的關(guān)系

    淺談servlet與jsp的關(guān)系

    本文主要介紹了servlet與jsp的相關(guān)知識,并總結(jié)出servlet與jsp之間的關(guān)系,具有很好的參考價值,下面跟著小編一起來看下吧
    2017-02-02
  • Java設計模式中的建造者(Builder)模式解讀

    Java設計模式中的建造者(Builder)模式解讀

    這篇文章主要介紹了Java設計模式中的建造者(Builder)模式解讀, 建造者模式是一種創(chuàng)建對象的設計模式,它通過將對象的構(gòu)建過程分解為多個步驟,并使用一個建造者類來封裝這些步驟,從而使得對象的構(gòu)建過程更加靈活和可擴展,需要的朋友可以參考下
    2023-10-10
  • 如何用Java的swing編寫簡單計算器

    如何用Java的swing編寫簡單計算器

    這篇文章主要給大家介紹了關(guān)于如何用Java的swing編寫簡單計算器的相關(guān)資料,通過本文可以設計一個圖形界面的簡易計算器,完成簡單的算術(shù)運算符,可以完成加法、減法、乘法、除法和取余運算,需要的朋友可以參考下
    2023-12-12
  • springboot接入cachecloud redis示例實踐

    springboot接入cachecloud redis示例實踐

    這篇文章主要介紹了springboot接入cachecloud redis示例實踐,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-10-10
  • SpringBoot升級3.2報錯Invalid value type for attribute ‘factoryBeanObjectType‘: java.lang.String的解決方案

    SpringBoot升級3.2報錯Invalid value type for 

    這篇文章給大家介紹了SpringBoot升級3.2報錯Invalid value type for attribute ‘factoryBeanObjectType‘: java.lang.String的解決方案,文中有詳細的原因分析,需要的朋友可以參考下
    2023-12-12
  • Java實現(xiàn)文件上傳的方法總結(jié)

    Java實現(xiàn)文件上傳的方法總結(jié)

    這篇文章主要為大家介紹了三種Java實現(xiàn)文件上傳的方法,文中的示例代碼講解詳細,對我們的學習或工作有一定的借鑒價值,感興趣的可以了解一下
    2023-04-04
  • jpa實現(xiàn)只查詢指定的字段

    jpa實現(xiàn)只查詢指定的字段

    這篇文章主要介紹了jpa實現(xiàn)只查詢指定的字段,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • 淺析Spring的JdbcTemplate方法

    淺析Spring的JdbcTemplate方法

    本篇淺析Spring的JdbcTemplate方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01

最新評論

龙川县| 竹溪县| 西青区| 卓尼县| 张家界市| 普安县| 婺源县| 石泉县| 宿州市| 新郑市| 贵州省| 永康市| 蚌埠市| 吴江市| 于都县| 夏津县| 贵港市| 定安县| 边坝县| 芜湖市| 磴口县| 博野县| 江口县| 吴旗县| 通海县| 河池市| 邳州市| 乡宁县| 新晃| 渭源县| 宁河县| 上林县| 丹东市| 若羌县| 读书| 南溪县| 霍邱县| 苍溪县| 周宁县| 阿克陶县| 广平县|