1. 程式人生 > >Java記憶體管理之GC垃圾回收機制是什麼?什麼是垃圾?如何判斷是否為垃圾?

Java記憶體管理之GC垃圾回收機制是什麼?什麼是垃圾?如何判斷是否為垃圾?

文章目錄


1. 垃圾回收機制是什麼?

垃圾回收機制讓開發者無需關注空間的建立和釋放,而是以守護程序的形式在後臺自動回收垃圾。

這樣做不僅提高了開發效率,更改善了記憶體的使用狀況。


2. 什麼是垃圾呢?如何判斷是否為垃圾呢?

什麼是垃圾?垃圾指所有不再存活的物件

常見的判斷是否存活有兩種方法:引用計數法可達性分析

  • 引用計數法
    為每一個建立的物件分配一個引用計數器,用來儲存該物件被引用的個數。當該個數為零,意味著沒有人再使用這個物件,可以認為“物件死亡”。但是,這種方案存在嚴重的問題,就是無法檢測“迴圈引用”:當兩個物件互相引用,即時它倆都不被外界任何東西引用,它倆的計數都不為零,因此永遠不會被回收。而實際上對於開發者而言,這兩個物件已經完全沒有用處了。
    因此,Java 裡沒有采用這樣的方案來判定物件的“存活性”。

  • 可達性分析
    基本思路是把所有引用的物件想象成一棵樹,從樹的根結點 GC Roots 出發,持續遍歷找出所有連線的樹枝物件,這些物件則被稱為“可達”物件,或稱“存活”物件。其餘的物件則被視為“死亡”的“不可達”物件,或稱“垃圾”。參考下圖,object5,object6 和 object7 便是不可達物件,視為“死亡狀態”,應該被垃圾回收器回收。

在這裡插入圖片描述


3. GC root指的是誰?

GC Roots 本身一定是可達的,這樣從它們出發遍歷到的物件才能保證一定可達。那麼,Java 裡有哪些物件是一定可達呢?

主要有以下四種:

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

這麼幾種型別的 GC Roots,每次垃圾回收器會從這些根結點開始遍歷尋找所有可達節點。