JVM 垃圾回收的時候如何確定垃圾?談談什麼是 GC Roots

🍀什麼是垃圾

簡單的說就是內存中已經不再被使用到的空間就是垃圾

🍀要進行垃圾回收,如何判斷一個對象是否可以被回收?

📌引用計數法

Java中,引用和對象是有關聯的。如果要操作對象則必須要引用進行。
因此,很顯然一個簡單的辦法是通過引用計數來判斷一個對象是否可以回收。簡單說,給對象中添加一個引用計數器,
每當有一個地方引用它,計數器值加1,
每當有一個引用失效時,計數器值減1。
任何時刻計數器值爲零的對象就是不可能再被使用的,那麼這個對象就是可回收對象。
那爲什麼主流的Java虛擬機裏面都沒有選用這種算法呢?其中最主要的原因是它很難解決對象之間相互循環引用的問題。

該算法存在但目前無人用了,解決不掉循環使用的問題,瞭解即可。

在這裏插入圖片描述

📌枚舉根節點做可達性分析(根搜索路徑)

爲了解決引用計數法的循環引用問題,Java 使用了可達性分析的方法。
在這裏插入圖片描述
所謂 “GC roots”或者說 tracing GC 的 “根集合” 就是一組必須活躍的引用

基本思路就是通過一系列名爲 “GC Roots” 的對象作爲起始點,從這個被稱爲 GC Roots 的對象開始向下搜索,如果一個對象到 GC Roots 沒有任何引用鏈相連時,則說明此對象不可用。也即給定一個集合的引用作爲根出發,通過引用關係遍歷對象圖,能被遍歷到的(可到達的)對象就被判定爲存活;沒有被遍歷到的就自然被判定爲死亡。

🎯示圖Case

在這裏插入圖片描述

🎯Java 中可以作爲 GC Roots 的對象
  • 虛擬機棧(棧幀中的局部變量區,也叫做局部變量表)中引用的對象
  • 方法區中的類靜態屬性引用的對象
  • 方法區中常量引用的對象
  • 本地方法棧中 JNI(Native方法)引用的對象
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章