一、可達性分析(根搜索)算法
JVM通過可達性分析來判定對象是否存活。這個算法的基本思路就是通過一系列稱為GC Roots
的對象作為起始點,從這些節點開始向下搜索,搜索所走過的路徑稱為引用鏈,當一個對象到GC Roots
沒有任何引用鏈相連時,則證明此對象是不可用的。如下圖中對象object1
、object2
、object3
、object4
是可用的對象,object5
、object6
、object7
雖然互相關聯,但是它們到GC Roots
是不可達的,所以它們將會被判定為是可回收的對象。
在Java語言中,可作為GC Roots的對象包括下面幾種:
1、虛擬機棧(棧幀中的本地變量)中引用的對象。
2、方法區中類靜態屬性引用的對象。
3、方法區中常量引用的對象。
4、本地方法棧中JNI(Native方法)引用的對象。
二、spring源代碼
spring
創建對象是通過實現接口BeanFactory
的類來實現的,有如下的實現結構:
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 singletonObjects
和beans
(在構造方法中new)都是直接使用關鍵字new
創建,是強引用,滿足作為GC Roots
對象的條件(虛擬機棧(棧幀中的本地變量)中引用的對象)。這樣創建的對象存在map
中和GC Roots對
象相連,所以不會被回收。
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。