首頁  >  文章  >  Java  >  jvm垃圾回收演算法有哪些

jvm垃圾回收演算法有哪些

青灯夜游
青灯夜游原創
2021-04-22 14:58:4032879瀏覽

jvm垃圾回收演算法:1、「標記–清除」演算法;先標記所有需要被回收的對象,然後在標記完成後統一回收所有被標記的對象。 2.複製演算法;將記憶體分割成等大的兩塊,每次只使用其中的一塊。 3.「標記–整理」演算法;4、分代收集演算法。

jvm垃圾回收演算法有哪些

本教學操作環境:windows7系統、java8版、DELL G3電腦。

JVM垃圾回收演算法


兩個概念:

##。新生代:存放生命週期較短的物件的區域。 老年代:存放生命週期較長的物件的區域。

相同點:都在Java堆上

1.標記–清除演算法

#執行步驟:

  • #標記:遍歷記憶體區域,標記需要回收的物件。
  • 清除:再次遍歷內存,對已經標記過的內存進行回收。

圖解:

jvm垃圾回收演算法有哪些

jvm垃圾回收演算法有哪些

缺點:

  • 效率問題;遍歷了兩次記憶體空間(第一次標記,第二次清除)。
  • 空間問題:容易產生大量記憶體碎片,當再需要一塊比較大的記憶體時,無法找到一塊符合要求的,因而不得不再次出發GC。

2.複製演算法

#將記憶體分割成等大的兩塊,每次只使用其中的一塊。當一塊用完了,觸發GC時,將該區塊中存活的物件複製到另一塊區域,然後一次清理掉這塊沒有用的記憶體。下次觸發GC時將那塊中存活的的又複製到這塊,然後抹掉那塊,循環往復。

圖解:

jvm垃圾回收演算法有哪些

jvm垃圾回收演算法有哪些

##優點

  • #相對於標記–清理演算法解決了記憶體的碎片化問題。
  • 效率更高(清理記憶體時,記住首尾位址,一次抹掉)。

缺點:

  • 記憶體使用率不高,每次只能使用一半記憶體。

改進

研究表明,新生代中的物件大都是「朝生夕死」的,即生命週期非常短而且對象活得越久則越難被回收。在發生GC時,需要回收的物件特別多,存活的特別少,因此需要移到另一塊記憶體的物件非常少,所以不需要1:1分割記憶體空間。而是將整個新生代依照8 : 1 : 1的比例分成三塊,最大的稱為Eden(伊甸園)區,較小的兩塊分別稱為To Survivor和From Survivor。

首次GC時,只需要將Eden存活的物件複製到To。然後將Eden區整體回收。再次GC時,將Eden和To存活的複製到From,循環往復這個過程。這樣每次新生代中可用的記憶體就佔整個新生代的90%,大大提高了記憶體使用率。 【相關推薦:Java影片教學

但無法保證每次存活的物件就永遠少於新生代整體的10%,此時複製過去是存不下的,因此這裡會用到另一塊內存,稱為老年代,進行分配擔保,將物件儲存到老年代。若還不夠,就會拋出OOM。

老年代:存放新生代中經過多次回收仍存活的物件(預設為15次)。

3. 標記–整理演算法

#因為前面的複製演算法當物件的存活率比較高時,這樣一直複製過來,複製過去,沒啥意義,且浪費時間。所以針對老年代提出了「標記整理」演算法。

執行步驟:

  • 標記:標記需要回收的
  • #:讓存活的對象,向記憶體的一端移動,然後直接清除沒有用的記憶體。

圖解:

jvm垃圾回收演算法有哪些jvm垃圾回收演算法有哪些

4. 分代收集演算法

目前大多商用虛擬機都採用這種分代收集演算法,這個演算法並沒有新的內容,只是根據物件的存活的時間的長短,將記憶體分為了新生代和老年代,這樣就可以針對不同的區域,採取對應的演算法。如:

  • 新生代,每次都有大量物件死亡,有老年代作為記憶體擔保,採取複製演算法。
  • 老年代,物件存活時間長,採用標記整理,或標記清理演算法都可。

MinorGC和FullGC的差異

#MinorGC:發生在新生代的垃圾回收,因為新生代的特點,MinorGC非常頻繁,且回收速度比較快,每次回收的量也很大。
FullGC:發生在老年代的垃圾回收,也稱為MajorGC,速度比較慢,相對於MinorGc慢10倍左右。進行一次FullGC通常伴隨多次多次MinorGC,。

更多程式相關知識,請造訪:程式設計影片! !

以上是jvm垃圾回收演算法有哪些的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn