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

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

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

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

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

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

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

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

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

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

二、spring源代碼

spring創(chuàng)建對象是通過實(shí)現(xiàn)接口BeanFactory的類來實(shí)現(xiàn)的,有如下的實(shí)現(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);
  }
}

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

總結(jié)

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

相關(guān)文章

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

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

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

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

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

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

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

    Java設(shè)計(jì)模式中的建造者(Builder)模式解讀

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

    如何用Java的swing編寫簡單計(jì)算器

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

    springboot接入cachecloud redis示例實(shí)踐

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

    SpringBoot升級3.2報(bào)錯(cuò)Invalid value type for 

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

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

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

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

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

    淺析Spring的JdbcTemplate方法

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

最新評論

漠河县| 将乐县| 昔阳县| 临汾市| 成安县| 阳高县| 郴州市| 武强县| 华池县| 咸宁市| 右玉县| 容城县| 肃宁县| 昌都县| 旬邑县| 南昌县| 安宁市| 连州市| 贵定县| 辰溪县| 盈江县| 陈巴尔虎旗| 鹰潭市| 定州市| 美姑县| 元谋县| 六枝特区| 本溪| 北安市| 临朐县| 静宁县| 阿克苏市| 滦南县| 营山县| 大同县| 安岳县| 额尔古纳市| 大石桥市| 拜泉县| 新闻| 崇州市|