1. 程式人生 > 遊戲資訊 >2022.4.5期全服記錄榜

2022.4.5期全服記錄榜

主要從什麼時候回收、回收哪些物件、怎麼回收三個方面敘述。

參考:

什麼時候進行垃圾回收

在JVM中,有一個垃圾回收執行緒,它是低優先順序的,在正常情況下是不會執行的,只有在虛擬機器空閒或者當前堆記憶體不足時,才會觸發執行,掃描那些沒有被任何引用的物件,並將它們新增到要回收的集合中,進行回收。

哪些物件會被回收

  1. 引用計數器法:為每個物件建立一個【引用計數器】,有物件引用時計數器 +1,引用被釋放時計數 -1(缺點:迴圈引用問題)
  2. 可達性分析法:從【 GC Roots 】開始向下搜尋,搜尋所走過的路徑稱為【引用鏈】。當一個物件到 GC Roots 沒有任何引用鏈相連時,則證明此物件是可以被回收的。

怎麼回收(回收演算法)

  1. 標記-清除

    標記可回收物件,然後清除(缺點:使得整塊記憶體碎片化)

  2. 複製演算法

    將記憶體分為相等大小的兩份,存活物件複製到另一份,然後清除剩下的部分。

  3. 標記-整理演算法

    存活物件移動到一端,剩下的一塊清理掉

  4. 分代回收演算法

    新生代(存活率低)基本採用複製演算法,老年代(存活率高)採用標記-整理或標記-清除演算法

    minor GC: 程式剛開始執行的時候,當eden區滿了的時候,會發起一次minor GC,將eden區存活物件複製到 from 區,大部分可回收物件則被清除;但from區也會慢慢被填滿,因此接下來的minor GC,會將eden和from區存活物件複製到 to 區,然後將 eden和 from區一次清理,這樣就保證了to和from區總有一個是空的。

    major GC:清理old區,使用標記-整理演算法(將存貨物件往一邊移動,然後將邊界的區域一次性清除)

問題:

1、什麼是GC roots

GC roots是可達性分析演算法中定義的一個根節點,從這個節點開始,引出下一個節點,如果下一個節點還指向有物件,就又引出一個節點,以此類推。這樣從GC root物件開始引出的一條線叫引用鏈,當沒有引用鏈指向的物件,就會被判定為可回收物件

2、哪些物件可以作為 GC root?

  • 虛擬機器棧(棧幀中的本地變量表)中引用的物件
  • 本地方法棧中 JNI(即一般說的 Native 方法)引用的物件
  • 方法區中類靜態屬性引用的物件
  • 方法區中常量引用的物件