溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

有哪些jvm垃圾回收算法

發(fā)布時間:2021-04-22 15:14:46 來源:億速云 閱讀:176 作者:Leah 欄目:編程語言

這篇文章將為大家詳細講解有關有哪些jvm垃圾回收算法,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

jvm垃圾回收算法:1、“標記–清除”算法;首先標記出所有需要被回收的對象,然后在標記完成后統(tǒng)一回收掉所有被標記的對象。2、復制算法;將內(nèi)存劃分為等大的兩塊,每次只使用其中的一塊。3、“標記–整理”算法;4、分代收集算法。

JVM垃圾回收算法


兩個概念:

新生代:存放生命周期較短的對象的區(qū)域。
老年代:存放生命周期較長的對象的區(qū)域。

相同點: 都在Java堆上

1.標記–清除算法

執(zhí)行步驟:

  • 標記:遍歷內(nèi)存區(qū)域,對需要回收的對象打上標記。

  • 清除:再次遍歷內(nèi)存,對已經(jīng)標記過的內(nèi)存進行回收。

圖解:

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

缺點:

  • 效率問題;遍歷了兩次內(nèi)存空間(第一次標記,第二次清除)。

  • 空間問題:容易產(chǎn)生大量內(nèi)存碎片,當再需要一塊比較大的內(nèi)存時,無法找到一塊滿足要求的,因而不得不再次出發(fā)GC。

2.復制算法

將內(nèi)存劃分為等大的兩塊,每次只使用其中的一塊。當一塊用完了,觸發(fā)GC時,將該塊中存活的對象復制到另一塊區(qū)域,然后一次性清理掉這塊沒有用的內(nèi)存。下次觸發(fā)GC時將那塊中存活的的又復制到這塊,然后抹掉那塊,循環(huán)往復。

圖解:

有哪些jvm垃圾回收算法

有哪些jvm垃圾回收算法

優(yōu)點

  • 相對于標記–清理算法解決了內(nèi)存的碎片化問題。

  • 效率更高(清理內(nèi)存時,記住首尾地址,一次性抹掉)。

缺點:

  • 內(nèi)存利用率不高,每次只能使用一半內(nèi)存。

改進

研究表明,新生代中的對象大都是“朝生夕死”的,即生命周期非常短而且對象活得越久則越難被回收。在發(fā)生GC時,需要回收的對象特別多,存活的特別少,因此需要搬移到另一塊內(nèi)存的對象非常少,所以不需要1:1劃分內(nèi)存空間。而是將整個新生代按照8 : 1 : 1的比例劃分為三塊,最大的稱為Eden(伊甸園)區(qū),較小的兩塊分別稱為To Survivor和From Survivor。

首次GC時,只需要將Eden存活的對象復制到To。然后將Eden區(qū)整體回收。再次GC時,將Eden和To存活的復制到From,循環(huán)往復這個過程。這樣每次新生代中可用的內(nèi)存就占整個新生代的90%,大大提高了內(nèi)存利用率?!鞠嚓P推薦:Java視頻教程】

但不能保證每次存活的對象就永遠少于新生代整體的10%,此時復制過去是存不下的,因此這里會用到另一塊內(nèi)存,稱為老年代,進行分配擔保,將對象存儲到老年代。若還不夠,就會拋出OOM。

老年代:存放新生代中經(jīng)過多次回收仍然存活的對象(默認15次)。

3. 標記–整理算法

因為前面的復制算法當對象的存活率比較高時,這樣一直復制過來,復制過去,沒啥意義,且浪費時間。所以針對老年代提出了“標記整理”算法。

執(zhí)行步驟:

  • 標記:對需要回收的進行標記

  • 整理:讓存活的對象,向內(nèi)存的一端移動,然后直接清理掉沒有用的內(nèi)存。

圖解:

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

4. 分代收集算法

當前大多商用虛擬機都采用這種分代收集算法,這個算法并沒有新的內(nèi)容,只是根據(jù)對象的存活的時間的長短,將內(nèi)存分為了新生代和老年代,這樣就可以針對不同的區(qū)域,采取對應的算法。如:

  • 新生代,每次都有大量對象死亡,有老年代作為內(nèi)存擔保,采取復制算法。

  • 老年代,對象存活時間長,采用標記整理,或者標記清理算法都可。

MinorGC和FullGC的區(qū)別

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

關于有哪些jvm垃圾回收算法就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

jvm
AI