Java GC 算法

JVM 提供了4種GC算法。

串行GC

4種GC種最簡單的算法。在單CPU機器或者32位的windows上,JVM運行在client模式下。在這種模式下,缺省垃圾回收的算法就是串行GC.

字如其名,串行GC使用單線程來處理垃圾回收。當(dāng)進行垃圾回收時,不管是minor GC,還是full gc,所有業(yè)務(wù)線程都會被stop。在full gc時,會全面壓縮old區(qū)內(nèi)存。

Throughput GC

針對多核平臺,或者64bit JVM, JVM一般運行在server模式。在這種模式下,缺省垃圾回收算法是吞吐量優(yōu)先GC.? ?

Throughput GC?GC使用多線程對young區(qū)進行內(nèi)存垃圾回收,這使得minor GC執(zhí)行的速度比串行GC要快。配置XX:+UseParalleGC開啟yong區(qū)的throuput GC。

當(dāng)然Throughput GC?GC也可以使用多線程對old 區(qū)進行垃圾回收。在JDK7之前,需要配置-XX;UseParallelOldGC參數(shù)開啟old區(qū)的吞吐量優(yōu)先GC算法。在JDK7u7之后,該特性默認開啟,所以無需配置此參數(shù)。

在使用此算法進行minor GC或者full GC時,所有應(yīng)用線程也會被stop。在進行full GC時,old區(qū)會被全面壓縮。

CMS GC

不管是串行GC還是throuput GC,在進行GC時都會stop應(yīng)用線程。為了減少GC造成的應(yīng)用線程停頓時間過長,CMS GC應(yīng)運而生。

在執(zhí)行minor GC時,CMS也是使用多線程進行來及回收,也會stop 應(yīng)用線程。但是和throughput GC不同的是,CMS使用了不一樣的算法對young 區(qū)進行來及回收。CMS使用-XX:+UseParNewGC,throughput GC使用了-XX:+UseParalleGC。

在進行full GC時,CMS不會停止應(yīng)用線程,而是使用后臺線程周期性的掃描old 區(qū)并丟棄不再被使用的對象。通過這樣的一個設(shè)計,CMS可以減少GC造成的應(yīng)用線程停頓時間。為了達成這個目標(biāo),要付出的代價就是更多的CPU資源消耗。因為后臺線程不會進行old區(qū)域的全全面壓縮,也會造成old區(qū)域的內(nèi)存碎片。如果沒有足夠的CPU資源或者old區(qū)域內(nèi)存碎片化比較嚴重,CMS會退化為串行GC一樣的行為:stop應(yīng)用線程,然后以單線程的方式進行清理和壓縮old區(qū)域內(nèi)存。降低或者消除了old內(nèi)存之后,CMS會回到預(yù)期的行為方式。

通過配置-XX:UseConMarkSweepGC(old 區(qū)域內(nèi)存GC)、-XX:UseParNewGC(young 區(qū)域內(nèi)存GC)方式開啟CMS GC.

G1 GC

在超過4G的heap size時候,為了最小化的減少GC造成的停頓,就設(shè)計了G1 GC.? 在大Heap配置下,heap在分代設(shè)計的基礎(chǔ)上,進一步被切分成了若干區(qū)域。

和CMS 相同的一點是,G1 GC在對old區(qū)域進行垃圾回收時,也是使用后臺線程進行處理,且不會stop應(yīng)用線程。因為old區(qū)內(nèi)存已經(jīng)被切分成了若干區(qū)域,g1 gc會把一些仍然在用的對象copy到另外一個區(qū)域,減少了內(nèi)存碎片化的程度,從而也減少了full GC的可能性。

和CMS一樣,G1 GC也需要足夠的cpu資源。配置-XX:UseG1 GC可以開啟 G1 GC.

總結(jié)

1. 所有GC 在minor GC時,都會stop應(yīng)用線程

2. throuput GC是一種吞吐量優(yōu)先GC,會以多線程并行的方式進行yong和old區(qū)域垃圾回收,副作用會帶來更長的停頓,使得應(yīng)用響應(yīng)時間邊長

3. CMS 和G1線程都是并發(fā)式GC,old區(qū)域GC不會stop 應(yīng)用線程,目標(biāo)是減少停頓。保證應(yīng)用線程的響應(yīng)時間。CMS容易造成更多內(nèi)存碎片,使得CMS 效果變差,而G1改善了內(nèi)存碎片問題。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、垃圾收集的意義 ?相對于C++來說,Java預(yù)言顯著的特點就是引入了垃圾回收機制,它使得Java程序員在編寫程...
    SunnyMore閱讀 2,224評論 0 50
  • 概述 垃圾收集 Garbage Collection 通常被稱為“GC”,它誕生于1960年 MIT 的 Lis...
    開心跳蚤閱讀 376評論 0 1
  • 原文閱讀 前言 這段時間懈怠了,罪過! 最近看到有同事也開始用上了微信公眾號寫博客了,挺好的~給他們點贊,這博客我...
    碼農(nóng)戲碼閱讀 6,161評論 2 31
  • 1.什么是垃圾回收? 垃圾回收(Garbage Collection)是Java虛擬機(JVM)垃圾回收器提供...
    簡欲明心閱讀 90,381評論 17 311
  • 這篇文章是我之前翻閱了不少的書籍以及從網(wǎng)絡(luò)上收集的一些資料的整理,因此不免有一些不準確的地方,同時不同JDK版本的...
    高廣超閱讀 16,059評論 3 83

友情鏈接更多精彩內(nèi)容