一、可達(dá)性分析(根搜索)算法
JVM通過可達(dá)性分析來判定對(duì)象是否存活。這個(gè)算法的基本思路就是通過一系列稱為GC Roots的對(duì)象作為起始點(diǎn),從這些節(jié)點(diǎn)開始向下搜索,搜索所走過的路徑稱為引用鏈,當(dāng)一個(gè)對(duì)象到GC Roots沒有任何引用鏈相連時(shí),則證明此對(duì)象是不可用的。如下圖中對(duì)象object1、object2、object3、object4是可用的對(duì)象,object5、object6、object7雖然互相關(guān)聯(lián),但是它們到GC Roots是不可達(dá)的,所以它們將會(huì)被判定為是可回收的對(duì)象。

在Java語(yǔ)言中,可作為GC Roots的對(duì)象包括下面幾種:
1、虛擬機(jī)棧(棧幀中的本地變量)中引用的對(duì)象。
2、方法區(qū)中類靜態(tài)屬性引用的對(duì)象。
3、方法區(qū)中常量引用的對(duì)象。
4、本地方法棧中JNI(Native方法)引用的對(duì)象。
二、spring源代碼
spring創(chuàng)建對(duì)象是通過實(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,是棧中引用的對(duì)象,可作為GC Roots 對(duì)象 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,是棧中引用的對(duì)象,可作為GC Roots 對(duì)象 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); }}從上面的源代碼可以看出,對(duì)象存放在一個(gè)Map中,其中mapsingletonObjects是用來存放單例對(duì)象的。map singletonObjects和beans(在構(gòu)造方法中new)都是直接使用關(guān)鍵字new創(chuàng)建,是強(qiáng)引用,滿足作為GC Roots對(duì)象的條件(虛擬機(jī)棧(棧幀中的本地變量)中引用的對(duì)象)。這樣創(chuàng)建的對(duì)象存在map中和GC Roots對(duì)象相連,所以不會(huì)被回收。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。
新聞熱點(diǎn)
疑難解答
圖片精選