JVM03——四種垃圾回收算法,你都了解了哪幾種


在之前的文章中,已經為各位帶來了JVM的內存結構與堆內存的相關介紹,今天將為為各位詳解JVM垃圾回收與算法。關注我的公眾號「Java面典」了解更多 Java 相關知識點。

如何確定垃圾

想要回收垃圾,必須得先知道,哪些對象可以被認定為垃圾。關於垃圾確定方式,主要有兩種,分別是引用計數法可訪問性分析法,其原理分別如下:

引用計數法

在 Java 中,引用與對象相關聯,如果要操作對象,則必須使用引用。因此,可以通過引用計數來確定對象是否可以回收。實現原則是,如果一個對象被引用一次,計數器 +1,反之亦然。當計數器為 0 時,該對象不被引用,則該對象被視為垃圾,並且可以被 GC 回收利用。

可達性分析

為了解決引用計數法的循環引用問題,Java 采用了可達性分析的方法。其實現原理是,將一系列"GCroot"對象作為搜索起點。如果在"GCroot"和一個對象之間沒有可達的路徑,則該對象被認為是不可訪問的。

要注意的是,不可達對象不等價於可回收對象,不可達對象變為可回收對象至少要經過兩次標記過程。兩次標記后仍然是可回收對象,則將面臨回收。

垃圾回收算法

了解了垃圾的確定方法后,我們將繼續了解垃圾是怎么被回收的,即垃圾回收算法。在Java中主要有四中垃圾回收算法,分別是標記清除算法復制算法標記整理算法分代收集算法

標記清除算法

“標記-清除”算法是最基礎的算法,分為標記清除兩個階段:首先標記出所有需要回收的對象,在標記完成后統一回收掉所有被標記的對象。

標記清除算法.png

由標記清除算法的實現我們可以看出,其主要存在兩個缺點:

  1. 效率問題。標記和清除過程的效率都不高
  2. 空間問題。標記清除之后會產生大量不連續的內存碎片,空間碎片太多可能會導致當程序在以后的運行過程中需要分配較大對象時無法找到足夠的連續內存而不得不提前觸發另一次垃圾收集動作。

復制算法

為了解決標記清除算法內存碎片化嚴重的缺陷,提出了復制算法。復制算法主要思想是,按內存容量將內存划分為大小相等的兩塊區域。每次只使用其中一塊,當這一塊內存滿后將其中存活的對象復制到另一塊上去,然后把該內存中的垃圾對象清理掉,其實現過程如圖:

復制算法.png

復制算法雖然實現簡單,內存效率高,不易產生碎片,但是最大的問題是可用內存被壓縮到了原本的一半。且存活對象增多的話,Copying 算法的效率會大大降低

標記整理算法

結合了以上兩個算法,為了避免缺陷而提出。標記階段和標記清理算法相同,標記后不是清理對象,而是將存活對象移向內存的一端。然后清除端邊界外的對象。如圖:

標記整理算法.png

分代收集算法

在結合以上三種算法的綜合分析及 JVM 內存對象生命周期的特點,誕生了一種新的垃圾回收算法——分代收集算法。其核心思想是根據對象存活的不同生命周期將內存划分為不同的域,一般情況下將 GC 堆划分為老年代(Tenured/Old Generation)和新生代(Young Generation)。老年代的特點是每次垃圾回收時只有少量對象需要被回收,新生代的特點是每次垃圾回收時都有大量垃圾需要被回收,因此可以根據不同區域選擇不同的算法。

新生代——復制算法

因為新生代中每次垃圾回收都要回收大部分對象,即要復制的操作比較少,但通常並不是按照 1:1 來划分新生代。一般將新生代划分為一塊較大的 Eden 空間和兩個較小的 Survivor 空間(From Space/S0, To Space/S1),每次使用 Eden 空間和其中的一塊 Survivor 空間,當進行回收時,將該兩塊空間中還存活的對象復制到另一塊 Survivor 空間中。

新生代.png

老年代——標記復制算法

而老年代因為每次只回收少量對象,因而采用標記整理算法。

  1. 對象的內存分配主要在新生代的 Eden Space 和 Survivor Space 的 From Space(Survivor 目前存放對象的那一塊),少數情況會直接分配到老年代;
  2. 當新生代的 Eden Space 和 From Space 空間不足時就會發生一次 GC,進行 GC 后,EdenSpace 和 From Space 區的存活對象會被挪到 To Space,然后將 Eden Space 和 FromSpace 進行清理;
  3. 如果 To Space 無法足夠存儲某個對象,則將這個對象存儲到老年代;
  4. 在進行 GC 后,使用的便是 Eden Space 和 To Space 了,如此反復循環;
  5. 當對象在 Survivor 區躲過一次 GC 后,其年齡就會 +1。默認情況下年齡到達 15 的對象會被移到老年代中。

JVM系列推薦

JVM02——JVM運行時內存

JVM01——JVM內存區域的構成


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM