spring啟動(dòng)后保證創(chuàng)建的對象不被垃圾回收器回收
一、可達(dá)性分析(根搜索)算法
JVM通過可達(dá)性分析來判定對象是否存活。這個(gè)算法的基本思路就是通過一系列稱為GC Roots的對象作為起始點(diǎn),從這些節(jié)點(diǎn)開始向下搜索,搜索所走過的路徑稱為引用鏈,當(dāng)一個(gè)對象到GC Roots沒有任何引用鏈相連時(shí),則證明此對象是不可用的。如下圖中對象object1、object2、object3、object4是可用的對象,object5、object6、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 singletonObjects和beans(在構(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)文章
Java設(shè)計(jì)模式中的建造者(Builder)模式解讀
這篇文章主要介紹了Java設(shè)計(jì)模式中的建造者(Builder)模式解讀, 建造者模式是一種創(chuàng)建對象的設(shè)計(jì)模式,它通過將對象的構(gòu)建過程分解為多個(gè)步驟,并使用一個(gè)建造者類來封裝這些步驟,從而使得對象的構(gòu)建過程更加靈活和可擴(kuò)展,需要的朋友可以參考下2023-10-10
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
這篇文章給大家介紹了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)文件上傳的方法,文中的示例代碼講解詳細(xì),對我們的學(xué)習(xí)或工作有一定的借鑒價(jià)值,感興趣的可以了解一下2023-04-04

