一、可達性分析算法
“GC Roots”根對象集作為起始點集合,從這些節點開始,根據引用關系向下搜索,搜索過程路徑稱為“引用鏈”。如果,某對象到GC Root沒有引用鏈相關聯,那么,就是GC Root到對象不可達,則證明這個對象不可能再被使用。

上圖所示,Object 1與GC Root可達,而Object 5與GC Root不可達。
二、GC Roots有哪些
在Java技術體系里面,固定作為GC Root的對象:
-
- 虛擬機棧中引用的對象,如:線程中被調用的方法堆棧中使用的參數、局部變量、臨時變量。
- 方法區中類靜態屬性引用的對象。
- 方法區中常量引用的對象,比如:字符串常量池里的引用。
- 本地方法棧中JNI引用的對象。
- Java虛擬機內部的引用,比如:基本數據類型對應的Class對象、常駐異常對象、系統類加載器,如:String、NullPointExcepition等。
- 所有被同步鎖持有的對象(synchronized關鍵字)。
- 反映Java虛擬機內部情況的JMXBean、JVMTI中注冊的回調、本地代碼緩存等。
