面試題之GC垃圾回收算法

一、簡介

今天我們總結一道常見的關於垃圾回收的面試題:

  • JVM垃圾回收算法有哪幾種?各自的優缺點?

我們都知道,JVM中堆可分爲:

【a】新生代:

  • Eden區域
  • From(s0)區域
  • To(s1)區域

【b】老年代

如下圖:

JVM垃圾回收的主要區域之一就是我們的堆。JVM在進行GC時,並非每次都對上面三個內存區域一起回收的,大部分時候回收的都是指新生代。

GC按照回收的區域又分了兩種類型:

  • 普通GC(minor GC)
  • 全局GC(major GC or Full GC)

Minor GC和Full GC的區別

  •   普通GC(minor GC):只針對新生代區域的GC,指發生在新生代的垃圾收集動作,因爲大多數Java對象存活率都不高,所以Minor GC非常頻繁,一般回收速度也比較快。
  •   全局GC(major GC or Full GC):指發生在老年代的垃圾收集動作,出現了Major GC,經常會伴隨至少一次的Minor GC(但並不是絕對的),Major GC的速度一般要比Minor GC慢上10倍以上 。

二、GC垃圾回收算法

【a】複製算法

複製算法原理:

Minor GC會把Eden中的所有活的對象都移到Survivor區域中,如果Survivor區中放不下,那麼剩下的活的對象就被移到老年代中,也即一旦收集後,Eden是就變成空的了。

當對象在 Eden ( 包括一個 Survivor 區域,這裏假設是 from 區域 ) 出生後,在經過一次 Minor GC 後,如果對象還存活,並且能夠被另外一塊 Survivor 區域所容納( 上面已經假設爲 from 區域,這裏應爲 to 區域,即 to 區域有足夠的內存空間來存儲 Eden 和 from 區域中存活的對象 ),則使用複製算法將這些仍然還存活的對象複製到另外一塊 Survivor 區域 ( 即 to 區域 ) 中,然後清理所使用過的 Eden 以及 Survivor 區域 ( 即 from 區域 ),並且將這些對象的年齡設置爲1,以後對象在 Survivor 區每熬過一次 Minor GC,就將對象的年齡 + 1,當對象的年齡達到某個值時 ( 默認是 15 歲,通過-XX:MaxTenuringThreshold 來設定參數),這些對象就會成爲老年代。

  • 優點:
  • 效率高
  •  
  • 缺點:
  • 1、使用複製算法浪費了一半的內存
  • 2、如果對象的存活率很高,那麼我們需要將很多對象都複製一遍,並將所有引用地址重置一遍,複製所花費的時間,在對象存活率達到一定程度時,將會變的不可忽視。 所以使用複製算法,對象的存活率要非常低纔行。

【b】標記清除算法

原理:標記清除算法分爲標記和清除兩個階段,先標記出要回收的對象,然後統一回收這些對象。如下圖描述:

用通俗的話解釋一下標記清除算法,就是當程序運行期間,若可以使用的內存被耗盡的時候,GC線程就會被觸發並將程序暫停,隨後將要回收的對象標記一遍,最終統一回收這些對象,完成標記清理工作接下來便讓應用程序恢復運行。

  • 優點:
  • 標記- 清除算法比較簡單,也是最基礎的算法。
  •  
  • 缺點:
  • 需要暫停整個應用,會產生內存碎片
  • 標記-清除算法效率並不高,如果有大量對象需要被回收,也就是需要對大量對象進行標記,顯然標記這些對象耗費的時間將會比較長,所以標記的效率並不高

【c】標記壓縮算法

原理:在整理壓縮階段,不再對標記的對像做回收,而是通過所有存活對像都向一端移動,然後直接清除邊界以外的內存。可以看到,標記的存活對象將會被整理,按照內存地址依次排列,而未被標記的內存會被清理掉。如此一來,當我們需要給新對象分配內存時,JVM只需要持有一個內存的起始地址即可,這比維護一個空閒列表顯然少了許多開銷。

  • 優點:
  • 彌補標記/清除算法當中,產生大量內存碎片的缺點;
  • 消除複製算法當中,內存減半的高額代價;
  •  
  • 缺點:
  • 效率不是很好

【d】分代收集算法

現代商用虛擬機基本都採用分代收集算法來進行垃圾回收。分代收集算法的思想,就是根據對象的不同生命週期,採用不同的垃圾回收算法,根據每一代的特點,選擇最適合該代的回收算法,達到最高的回收效率。對象存活率比較低(新生代),使用複製算法,複製成本低;對象存活率高(老年代),採用標記-清理算法或者標記-整理算法。

三、總結

以上就是關於GC垃圾回收算法的一些總結,如果面試遇到相關問題,可以從垃圾回收的原理,然後講述大體的流程,再說上優點、缺點,這道題應該就差不多了。更多關於GC相關的知識可以參考我的另外一篇文章:

https://blog.csdn.net/Weixiaohuai/article/details/86559166

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