国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Java > 正文

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

2019-11-26 13:46:02
字體:
供稿:網(wǎng)友

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

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

在Java語(yǔ)言中,可作為GC Roots的對(duì)象包括下面幾種:

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

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

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

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

二、spring源代碼

spring創(chuàng)建對(duì)象是通過實(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,是棧中引用的對(duì)象,可作為GC Roots 對(duì)象  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,是棧中引用的對(duì)象,可作為GC Roots 對(duì)象    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);  }}

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

總結(jié)

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

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 香格里拉县| 那坡县| 西宁市| 呼和浩特市| 宁安市| 阿克陶县| 城固县| 金阳县| 洞口县| 桑植县| 静安区| 刚察县| 错那县| 竹北市| 镇宁| 白水县| 阳江市| 巴彦淖尔市| 宁国市| 朔州市| 舟曲县| 南召县| 雅江县| 平谷区| 双峰县| 耿马| 霞浦县| 筠连县| 玛纳斯县| 旅游| 军事| 双江| 阿城市| 枝江市| 蓬溪县| 江门市| 花莲市| 辽中县| 丰顺县| 梁河县| 台北县|