国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - spring啟動后保證創建的對象不被垃圾回收器回收

spring啟動后保證創建的對象不被垃圾回收器回收

2020-06-19 11:37daisy JAVA教程

最近看到一個問題是,spring在啟動后如何保證創建的對象不被垃圾回收器回收?。所以本文結合jvm的垃圾回收機制和spring中的源代碼做出自己的一點猜測。有需要的朋友們可以參考借鑒。

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

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

spring啟動后保證創建的對象不被垃圾回收器回收

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

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

     2、方法區中類靜態屬性引用的對象。

     3、方法區中常量引用的對象。

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

二、spring源代碼

spring創建對象是通過實現接口BeanFactory的類來實現的,有如下的實現結構:

spring啟動后保證創建的對象不被垃圾回收器回收

SimpleJndiBeanFactory.java

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class SimpleJndiBeanFactory extends JndiLocatorSupport implements BeanFactory {
  private final Set<String> shareableResources = new HashSet();
  //使用new創建的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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class StaticListableBeanFactory implements ListableBeanFactory {
  private final Map<String, Object> beans;
  public StaticListableBeanFactory() {
    //使用new創建的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(在構造方法中new)都是直接使用關鍵字new創建,是強引用,滿足作為GC Roots對象的條件(虛擬機棧(棧幀中的本地變量)中引用的對象)。這樣創建的對象存在map中和GC Roots對象相連,所以不會被回收。

總結

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日韩中文字幕在线播放 | 免费的av | 色综合久久一区二区三区 | 99视频在线 | 久久中文精品 | 一本大道综合伊人精品热热 | 亚洲综合大片69999 | 在线观看av网站永久 | 五月宗合网 | 欧美一级精品片在线看 | 最近的中文字幕在线看视频 | 午夜久久久久久久久久一区二区 | 亚洲国产精品免费 | 亚洲一区二区三区在线播放 | 视频一二区 | 国产日韩欧美在线 | 五月天狠狠爱 | 男人午夜天堂 | 一级毛片免费 | 精品国产乱码久久久久久闺蜜 | 免费看黄在线 | 免费观看一级视频 | 亚洲九区| 欧美精品福利视频 | 午夜影院久久 | 久久久成人精品 | 国产精品免费av | 国产欧美久久一区二区三区 | 在线观看欧美日韩 | 五月天导航 | 99re在线精品 | 久久精品青青大伊人av | 亚洲国产精品久久久久秋霞不卡 | 国产精品成人一区 | 精品久久一区二区三区 | 精品久久久久一区二区国产 | 精品天堂| 国产亚洲精品久久久闺蜜 | 免费毛片一级 | 亚洲午夜免费 | 精品久久久av |