可達性分析算法


算法思路

這個算法的基本思路就是通過一系列稱為“GC Roots”的根對象作為起始節點集,從這些節點開始,根據引用關系向下搜索,搜索過程所走過的路徑成為“引用鏈”(Refenrence Chain),如果某個對象到GC Roots間沒有任何引用鏈相連,或者用圖論的話來說就是從GC Roots到這個對象不可達時,則證明此對象是不可能再被使用的。

GC Roots

在Java技術體系里面,固定可作為GC Roots的對象包括以下幾種:

  • 在虛擬機棧(棧幀中的本地變量表)中引用的對象,譬如當前正在運行的方法所使用到的參數、局部變量、臨時變量等
  • 類靜態屬性引用的對象,譬如Java類的引用類型靜態變量
  • 常量引用的對象,譬如字符串常量池(String Table)里的引用
  • 在本地方法棧中JNI(即通常所說的Native方法)引用的對象
  • Java虛擬機內部的引用,如基本數據類型對應的Class對象,一些常駐的異常對象(比如NullPointException、OutOfMemoryError)等,還有系統類加載器
  • 所有被同步鎖(synchronized關鍵字)持有的對象
  • 反映Java虛擬機內部情況的JMXBeanJVMTI中注冊的回調、本地代碼緩存等

除了這些固定的GC Roots集合以外,根據用戶所選用的垃圾收集器以及當前回收的內存區域不同,還可以有其他對象“臨時性”地加入,共同構成完整GC Roots集合。譬如分代收集和局部回收(Partial GC),如果只針對Java堆中某一塊區域發起垃圾收集時(如最典型的只針對新生代的垃圾收集),必須考慮到內存區域是虛擬機自己的實現細節(在用戶視角里任何內存區域都是不可見的),更不是孤立封閉的,所以某個區域里的對象完全有可能被位於堆中其他區域的對象所引用,這時候就需要將這些關聯區域的對象也一並加入GC Roots集合中去,才能保證可達性分析的正確性。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM