一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

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

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對象相連,所以不會被回收。

總結

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产成人精品第一区二区 | 毛片啪啪视频 | 17岁韩国在线观看免费1 | 日本手机在线 | 91大神第九部红酒气质女 | 4hu四虎永久网址 | 欧美三级一区 | 国产日韩欧美综合一区二区三区 | 精品国产日韩一区三区 | 三级无删减高清在线影院 | 国内精品福利丝袜视频_速 国内精品91久久久久 | 欧美成人一区二区三区 | 激情三级做爰在线观看激情 | 故意短裙公车被强好爽在线播放 | 精品精品国产自在现拍 | 精品久久香蕉国产线看观看亚洲 | 青青草国产精品免费 | 99热久久国产精品这里 | 国自产拍在线天天更新91 | 操操综合网 | 国内精品视频一区二区三区八戒 | 亚洲黄视频在线观看 | 日韩欧美中文字幕一区二区三区 | 手机在线观看国产精选免费 | 我们日本在线观看免费动漫下载 | chinese老头和老太交hd | 99在线精品免费视频九九视 | 嫩模被黑人粗大挺进 | 日本老师动漫 | 99精品视频在线观看免费播放 | 青草福利视频 | 天堂a免费视频在线观看 | 亚洲欧美日韩综合在线 | 日本草草视频 | 搡60一70岁的老女人小说 | caoporn草棚在线视频 | 99在线精品日韩一区免费国产 | 国产精品一区二区久久不卡 | 91免费永久国产在线观看 | 东北老妇露脸xxxxx | 国产高清在线精品一区 |