激情久久久_欧美视频区_成人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對象相連,所以不會被回收。

總結

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日韩视频在线观看免费 | 久久久久国产成人免费精品免费 | 娇妻被各种姿势c到高潮小说 | 国产午夜网 | 亚洲第一综合 | 免费一级特黄欧美大片勹久久网 | 国产成人在线播放视频 | 牛牛热这里只有精品 | 欧美亚成人 | 九一传媒在线观看 | 久夜tv | 国产一区日韩一区 | 一区二区三区黄色 | 7777奇米成人四色影视 | hdjapanesemassagehd日本 | 精品国产一区二区三区在线 | 92看片淫黄大片欧美看国产片 | 久久99国产伦子精品免费 | 91看片在线免费观看 | 欧美成人毛片 | 国产papa | 欧美一级黄 | 欧美人与性禽动交精品 | 国产日本在线播放 | 中国av中文字幕 | 福利一区二区三区视频在线观看 | 成人一级黄色大片 | www.理论片| 国产一区视频免费观看 | av在线播放免费观看 | 国产二区三区视频 | 中文字幕综合在线观看 | 国产精品wwww | 伊人亚洲精品 | 免费观看一级黄色片 | 久久伊| 91精品成人福利在线播放 | 日本在线不卡一区二区三区 | chengrenyingshi| 国产精品野外av久久久 | 99ri在线|