jvm 垃圾回收算法

jvm 垃圾回收算法

  • 引用計數法
  • 標記清除法
  • 標記壓縮法
  • 複製算法
  • 分代算法
  • 分區

引用計數法

引用計數法,就是只要有對象引用,計數就加1,垃圾清理的時候對計數爲0的直接清理。缺點:循環引用的問題,無法解決,因此java 回收器沒有用這個算法。

標記清除法

標記清除主要分爲兩個階段:標記階段和清除階段,標記階段首先通過根節點,標記所有從根節點開始可到達的對象,因此,未被標記的就是未被引用的對象,清除階段,就清除所有未被標記的的對象。次算法可能產生大量的空間碎片。

標記清除算法

標記壓縮算法

標記壓縮算法是一種老年代回收算法,它在標記清除的算法基礎之上做了一些改進,它在標記階段跟標記清除算法一致,但是之後,並不是簡單地清除未標記的對象,而是將所有的存活對象壓縮到內存的一端,之後在清除爲標記的所有對象。
標記壓縮算法

複製算法

複製算法的核心思想:將原有的內存空間分爲兩塊,每次只使用其中一塊,在垃圾回收時,將正式使用的內存中的存活對象賦值到未使用的內存塊中,之後,清除正在使用的內存塊中的所有對象,交換兩個內存的角色,完成垃圾回收。次算法代價很大,相當於將可以使用的內存縮小爲了原來的一半。 還浪費資源
Jvm 新生代回收器,基本都是使用複製算法。新生代,分爲eden空間、from空間和to空間3個部分,其中from和to空間可以視爲用於複製的兩塊大小相同,地位相等且可以進行角色互換的空間塊。from和to 也被稱爲survivor空間,即倖存者空間,用於存放未被回收的對象。
複製算法

在GC開始的時候,對象只會存在於Eden區和名爲“From”的Survivor區,Survivor區“To”是空的。緊接着進行GC,Eden區中所有存活的對象都會被複制到“To”,而在“From”區中,仍存活的對象會根據他們的年齡值來決定去向。年齡達到一定值(年齡閾值,可以通過-XX:MaxTenuringThreshold來設置)的對象會被移動到年老代中,沒有達到閾值的對象會被複制到“To”區域。經過這次GC後,Eden區和From區已經被清空。這個時候,“From”和“To”會交換他們的角色,也就是新的“To”就是上次GC前的“From”,新的“From”就是上次GC前的“To”。不管怎樣,都會保證名爲To的Survivor區域是空的。Minor GC會一直重複這樣的過程,直到“To”區被填滿,“To”區被填滿之後,會將所有對象移動到年老代中。

分代算法

上面介紹的算法各有優缺點,沒有誰能替代誰,故jvm引入分代算法,將內存區間根據對象的生命週期特點分成幾塊,每塊選擇不同的算法,以提供垃圾回收的效率。
JVM分代圖

新生代 一般採用 複製算法,老年代,採用標記清除,標記壓縮算法。

分區

分區算法將整個堆空間劃分成連續的不同小區間,每個小區間獨立使用,獨立回收,這種算法的好處是可以控制一次回收多少個小區間。未來G1回收器就是使用次算法。

下一張介紹一下回收器和GC調優日誌

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章