004-JVM-Java中使用的標記階段的演算法:可達性分析演算法中GC Roots有哪些
上一篇:003-JVM-標記階段的演算法:怎麼確定垃圾 https://blog.csdn.net/fsjwin/article/details/111322134
gc roots有哪些呢?這個是面試題,也要背下來,如果不想進大廠的話,可以不背。
1. 常規gc roots
-
- JVM stack
虛擬機器棧中引用的物件
比如: 各個執行緒被呼叫的方法中使用到的引數、區域性變數等
- JVM stack
-
- nativ method stack
JNI( 通常說的本地方法) 引用的物件
- nativ method stack
-
- runtime constant pool
執行時常量池
- runtime constant pool
-
- static references in method area
(堆jdk8)中類靜態屬性引用的物件
比如: Java 類的引用型別靜態變數
(堆jdk8) 中常量引用的物件
比如: 字串常量池(String Table ) 裡的引用
- static references in method area
-
- Clazz
Java 虛擬機器內部的引用。
基本資料型別對應的Class物件, 一些常駐的異常物件( 如:NullPointerException 、OutOfMemoryError) , 系統類載入器
- Clazz
-
- 所有被同步鎖synchronized持有的物件
- 所有被同步鎖synchronized持有的物件
除了這些固定的GC Roots集合以外, 根據使用者所選用的垃圾收集器以及當前回收的記憶體區域不同, 還可以有其他物件“ 臨時性” 地加入, 共同構成完整GC Roots 集合。比如: 分代收集和區域性回收( Partial GC)
如果只針對Java 堆中的某一塊區域進行垃圾回收( 比如: 典型的只針對新生代) , 必須考慮到記憶體區域是虛擬機器自己的實現細節, 更不是孤立封閉的, 這個區域的物件完全有可能被其他區域的物件所引用,這時候就需要一併將關聯的區域物件也加入GC Roots集合中去考慮, 才能保證可達性分析的準確性。
區域性回收:意思如果分代回收的時候,比如對年輕代進行回收,那麼在老年代中的變數(其指向了年輕代。),也需要放入Roots Set中。否則就會出現誤傷!
小技巧:由於Root採用棧方式存放變數和指標, 所以如果一個指標, 它儲存了堆記憶體裡面的物件, 但是自己又不存放在堆記憶體裡面, 那它就是一個Root。
2. 臨時 gc roots
除了這些固定的GC Roots集合以外, 根據使用者所選用的垃圾收集器以及當前回收的記憶體區域不同, 還可以有其他物件“ 臨時性” 地加入, 共同構成完整GC Roots 集合。比如: 分代收集和區域性回收( Partial GC)
- 如果只針對Java 堆中的某一塊區域進行垃圾回收( 比如: 典型的只針對新生代) , 必須考慮到記憶體區域是虛擬機器自己的實現細節, 更不是孤立封閉的, 這個區域的物件完全有可能被其他區域的物件所引用,這時候就需要一併將
關聯的區域物件也加入GC Roots集合中
去考慮, 才能保證可達性分析的準確性。 - 區域性回收:意思如果分代回收的時候,比如對年輕代進行回收,
那麼在老年代中的變數(其指向了年輕代。)
,也需要放入Roots Set中。否則就會出現誤傷!
小技巧:由於Root採用棧方式存放變數和指標, 所以如果一個指標, 它儲存了堆記憶體裡面的物件, 但是自己又不存放在堆記憶體裡面, 那它就是一個Root。(此說法不嚴謹:比如上面提到的 “ 臨時性” 地加入的;jdk8中的StringTable、Static變數等,均在堆中。
但是可以作為一般的評判標準)
3. 總結
- 常規的6中需要在roots set中
- 特殊的兩種在roots set 中。
相關文章
- GC roots如何判斷物件不可達GC物件
- .Net7 GC標記階段程式碼的改變GC
- 垃圾回收演算法|GC標記-清除演算法演算法GC
- 程式設計師的成長過程中,有哪些階段?程式設計師
- C++中的可見性 指標 筆記C++指標筆記
- 《垃圾回收的演算法與實現》第2章GC標記-清除演算法演算法GC
- 在K8S中,PV 生命週期內的有哪些階段?K8S
- java中什麼樣的物件才能作為gc root物件,gc root物件有哪些Java物件GC
- Https中公私鑰加密演算法和其使用的RSA演算法分析HTTP加密演算法
- FDD中第一階段建模與需求分析的困惑
- Java虛擬機器-GC垃圾回收演算法-標記清除法、複製演算法、標記壓縮法、分代演算法Java虛擬機GC演算法
- Go語言實時GC - 三色標記演算法GoGC演算法
- java中break標記的使用Java
- PHP中RSA加密演算法的使用PHP加密演算法
- 計算機視覺中,究竟有哪些好用的目標跟蹤演算法(上)計算機視覺演算法
- 計算機視覺中,究竟有哪些好用的目標跟蹤演算法(下)計算機視覺演算法
- 人工智慧學習階段有哪些?人工智慧
- 面試每日一題011:從新手階段到流失階段,遊戲的階段性目標是什麼?面試每日一題遊戲
- SSL證書的加密演算法有哪些?加密演算法
- JVM的四種GC演算法JVMGC演算法
- 圖解Golang的GC演算法圖解GolangGC演算法
- GC的四種清理演算法GC演算法
- CUJ:標準庫:標準庫中的搜尋演算法 (轉)演算法
- bang 你的jive中的hash加密演算法有相應的解密演算法嗎?加密演算法解密
- AES演算法在Python中的使用演算法Python
- 測一測你的演算法階段學習成果演算法
- 經典的兩階段提交演算法原理及缺陷演算法
- 中華通訊錄演算法分析演算法
- AAAI 2020 | 北大:圖卷積中的多階段自監督學習演算法AI卷積演算法
- 關於中國象棋中走字合法性判斷的演算法(有我用TC2.0寫的演算法) (轉)演算法
- java面試一日一題:java中垃圾回收演算法有哪些Java面試演算法
- 專案啟動階段有哪些管理技巧?
- Java記憶體模型及GC演算法Java記憶體模型GC演算法
- 卡牌遊戲中的隨機性(下):使用標誌性元素遊戲隨機
- 負載均衡常見的演算法有哪些?負載演算法
- 達成智慧數字經營的指標有哪些?指標
- 幽默!分散式系統共識演算法的三階段分散式演算法
- Redis中的LFU演算法Redis演算法