spring啟動后保證創(chuàng)建的對象不被垃圾回收器回收
一、可達性分析(根搜索)算法
JVM通過可達性分析來判定對象是否存活。這個算法的基本思路就是通過一系列稱為GC Roots
的對象作為起始點,從這些節(jié)點開始向下搜索,搜索所走過的路徑稱為引用鏈,當一個對象到GC Roots
沒有任何引用鏈相連時,則證明此對象是不可用的。如下圖中對象object1
、object2
、object3
、object4
是可用的對象,object5
、object6
、object7
雖然互相關(guān)聯(lián),但是它們到GC Roots
是不可達的,所以它們將會被判定為是可回收的對象。
在Java語言中,可作為GC Roots的對象包括下面幾種:
1、虛擬機棧(棧幀中的本地變量)中引用的對象。
2、方法區(qū)中類靜態(tài)屬性引用的對象。
3、方法區(qū)中常量引用的對象。
4、本地方法棧中JNI(Native方法)引用的對象。
二、spring源代碼
spring
創(chuàng)建對象是通過實現(xiàn)接口BeanFactory
的類來實現(xiàn)的,有如下的實現(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); } }
從上面的源代碼可以看出,對象存放在一個Map中,其中mapsingletonObjects
是用來存放單例對象的。map singletonObjects
和beans
(在構(gòu)造方法中new)都是直接使用關(guān)鍵字new
創(chuàng)建,是強引用,滿足作為GC Roots
對象的條件(虛擬機棧(棧幀中的本地變量)中引用的對象)。這樣創(chuàng)建的對象存在map
中和GC Roots對
象相連,所以不會被回收。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。
相關(guān)文章
springboot整合mail實現(xiàn)郵箱的發(fā)送功能
本文分步驟給大家介紹springboot整合mail實現(xiàn)郵箱的發(fā)送功能,代碼簡單易懂,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧2021-09-09往DAO類中注入@PersistenceContext和@Resource的區(qū)別詳解
這篇文章主要介紹了往DAO類中注入@PersistenceContext和@Resource的區(qū)別詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02Spring Security 實現(xiàn)短信驗證碼登錄功能
這篇文章主要介紹了Spring Security 實現(xiàn)短信驗證碼登錄功能,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-05-05spring data jpa 創(chuàng)建方法名進行簡單查詢方式
這篇文章主要介紹了spring data jpa 創(chuàng)建方法名進行簡單查詢方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02Spring?Boot實現(xiàn)消息的發(fā)送和接收使用實戰(zhàn)指南
這篇文章主要為大家介紹了Spring?Boot實現(xiàn)消息的發(fā)送和接收使用實戰(zhàn)指南,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-06-06