Java語言規範沒有明確地說明JVM使用哪種垃圾回收演算法,但是任何一種垃圾收集演算法一般要做2件基本的事情: (1)發現無用信息對象; (2)回收被無用對象占用的記憶體空間,使該空間可被程式再次使用。 大多數垃圾回收演算法使用了根集(root set)這個概念;所謂根集就量正在執行的Java程式可以訪問的 ...
Java語言規範沒有明確地說明JVM使用哪種垃圾回收演算法,但是任何一種垃圾收集演算法一般要做2件基本的事情:
(1)發現無用信息對象;
(2)回收被無用對象占用的記憶體空間,使該空間可被程式再次使用。
大多數垃圾回收演算法使用了根集(root set)這個概念;所謂根集就量正在執行的Java程式可以訪問的引用變數的集合(包括局部變數、參數、類變數),程式可以使用引用變數訪問對象的屬性和調用對象的方法。
垃圾收集首選需要確定從根開始哪些是可達的和哪些是不可達的,從根集可達的對象都是活動對象,它們不能作為垃圾被回收,這也包括從根集間接可達的對象。而根集通過任意路徑不可達的對象符合垃圾收集的條件,應該被回收。下麵介紹幾個常用的演算法。
引用計數法(Reference Counting Collector)
引用計數法是唯一沒有使用根集的垃圾回收演算法,該演算法使用引用計數器來區分存活對象和不再使用的對象。一般來說,堆中的每個對象對應一個引用計數器。當每一次創建一個對象並賦給一個變數時,引用計數器置為1。當對象被賦給任意變數時,引用計數器每次加1。當對象出了作用域後(該對象丟棄不再使用),引用計數器減1,一旦引用計數器為0,對象就滿足了垃圾收集的條件。
基於引用計數器的垃圾收集器運行較快,不會長時間中斷程式執行,適宜地必須 實時運行的程式。但引用計數器增加了程式執行的開銷,因為每次對象賦給新的變數 ,計數器加1,而每次現有對象出了作用域生,計數器減1。