JVM——GC垃圾收集器

前言

今天就來介紹一下GC垃圾收集器惠遏。

GC 垃圾收集器

Java 堆內(nèi)存被劃分為新生代和年老代兩部分,新生代主要使用復制和標記-清除垃圾回收算法;年老代主要使用標記-整理垃圾回收算法矫户,因此 java 虛擬中針對新生代和年老代分別提供了多種不同的垃圾收集器,JDK1.6 中 Sun HotSpot 虛擬機的垃圾收集器如下:


Serial 垃圾收集器(單線程残邀、復制算法)

Serial(英文連續(xù))是最基本垃圾收集器皆辽,使用復制算法,曾經(jīng)是 JDK1.3.1 之前新生代唯一的垃圾收集器芥挣。Serial 是一個單線程的收集器驱闷,它不但只會使用一個 CPU 或一條線程去完成垃圾收集工作,并且在進行垃圾收集的同時空免,必須暫停其他所有的工作線程空另,直到垃圾收集結(jié)束。
Serial 垃圾收集器雖然在收集垃圾過程中需要暫停所有其他的工作線程蹋砚,但是它簡單高效扼菠,對于限定單個 CPU 環(huán) 境來說,沒有線程交互的開銷坝咐,可以獲得最高的單線程垃圾收集效率循榆,因此 Serial 垃圾收集器依然是 java 虛擬機運行在 Client 模式下默認的新生代垃圾收集器。

ParNew 垃圾收集器(Serial+多線程)

ParNew 垃圾收集器其實是 Serial 收集器的多線程版本畅厢,也使用復制算法冯痢,除了使用多線程進行垃圾收集之外,其余的行為和 Serial 收集器完全一樣框杜,ParNew 垃圾收集器在垃圾收集過程中同樣也要暫停所有其他的工作線程浦楣。ParNew 收集器默認開啟和 CPU 數(shù)目相同的線程數(shù),可以通過-XX:ParallelGCThreads 參數(shù)來限制垃圾收集器 的線程數(shù)咪辱≌窭停【Parallel:平行的】
ParNew 雖然是除了多線程外和 Serial 收集器幾乎完全一樣,但是 ParNew 垃圾收集器是很多 java 虛擬機運行在 Server 模式下新生代的默認垃圾收集器油狂。

Parallel Scavenge 收集器(多線程復制算法历恐、高效)

Parallel Scavenge 收集器也是一個新生代垃圾收集器,同樣使用復制算法专筷,也是一個多線程的垃圾收集器弱贼,它重點關注的是程序達到一個可控制的吞吐量(Thoughput,CPU 用于運行用戶代碼 的時間/CPU 總消耗時間磷蛹,即吞吐量=運行用戶代碼時間/(運行用戶代碼時間+垃圾收集時間))吮旅,高吞吐量可以最高效率地利用 CPU 時間,盡快地完成程序的運算任務味咳,主要適用于在后臺運算而不需要太多交互的任務庇勃。自適應調(diào)節(jié)策略也是 ParallelScavenge 收集器與 ParNew 收集器的一個 重要區(qū)別檬嘀。

Serial Old 收集器(單線程標記整理算法 )

Serial Old 是 Serial 垃圾收集器年老代版本,它同樣是個單線程的收集器责嚷,使用標記-整理算法鸳兽,這個收集器也主要是運行在 Client 默認的 java 虛擬機默認的年老代垃圾收集器。
在 Server 模式下揍异,主要有兩個用途:

  1. 在 JDK1.5 之前版本中與新生代的 Parallel Scavenge 收集器搭配使用。
  2. 作為年老代中使用 CMS 收集器的后備垃圾收集方案爆班。

新生代 Serial 與年老代 Serial Old 搭配垃圾收集過程圖:



新生代 Parallel Scavenge 收集器與 ParNew 收集器工作原理類似蒿秦,都是多線程的收集器,都使用的是復制算法蛋济,在垃圾收集過程中都需要暫停所有的工作線程。新生代 Parallel Scavenge/ParNew 與年老代 Serial Old 搭配垃圾收集過程圖:


Parallel Old 收集器(多線程標記整理算法)

Parallel Old 收集器是 Parallel Scavenge 的年老代版本炮叶,使用多線程的標記-整理算法碗旅,在 JDK1.6 才開始提供。在 JDK1.6 之前镜悉,新生代使用 ParallelScavenge 收集器只能搭配年老代的 Serial Old 收集器祟辟,只能保證新生代的吞吐量優(yōu)先,無法保證整體的吞吐量侣肄,Parallel Old 正是為了在年老代同樣提供吞吐量優(yōu)先的垃圾收集器旧困,如果系統(tǒng)對吞吐量要求比較高,可以優(yōu)先考慮新生代 Parallel Scavenge 和年老代 Parallel Old 收集器的搭配策略稼锅。 新生代 Parallel Scavenge 和年老代 Parallel Old 收集器搭配運行過程圖:


CMS 收集器(多線程標記清除算法)

Concurrent mark sweep(CMS)收集器是一種年老代垃圾收集器吼具,其最主要目標是獲取最短垃圾回收停頓時間,和其他年老代使用標記-整理算法不同矩距,它使用多線程的標記-清除算法拗盒。
最短的垃圾收集停頓時間可以為交互比較高的程序提高用戶體驗。
CMS 工作機制相比其他的垃圾收集器來說更復雜锥债,整個過程分為以下 4 個階段:

初始標記

只是標記一下 GC Roots 能直接關聯(lián)的對象陡蝇,速度很快,仍然需要暫停所有的工作線程哮肚。

并發(fā)標記

進行 GC Roots 跟蹤的過程登夫,和用戶線程一起工作,不需要暫停工作線程允趟。

重新標記

為了修正在并發(fā)標記期間恼策,因用戶程序繼續(xù)運行而導致標記產(chǎn)生變動的那一部分對象的標記 記錄,仍然需要暫停所有的工作線程拼窥。

并發(fā)清除

清除 GC Roots 不可達對象戏蔑,和用戶線程一起工作蹋凝,不需要暫停工作線程。由于耗時最長的并發(fā)標記和并發(fā)清除過程中总棵,垃圾收集線程可以和用戶現(xiàn)在一起并發(fā)工作鳍寂,所以總體上來看 CMS 收集器的內(nèi)存回收和用戶線程是一起并發(fā)地執(zhí)行。
CMS 收集器工作過程:

收集器

Garbage first 垃圾收集器是目前垃圾收集器理論發(fā)展的最前沿成果情龄,相比與 CMS 收集器迄汛,G1 收集器兩個最突出的改進是:

  1. 基于標記-整理算法,不產(chǎn)生內(nèi)存碎片骤视。
  2. 可以非常精確控制停頓時間鞍爱,在不犧牲吞吐量前提下,實現(xiàn)低停頓垃圾回收专酗。

G1 收集器避免全區(qū)域垃圾收集睹逃,它把堆內(nèi)存劃分為大小固定的幾個獨立區(qū)域,并且跟蹤這些區(qū)域的垃圾收集進度祷肯,同時在后臺維護一個優(yōu)先級列表沉填,每次根據(jù)所允許的收集時間,優(yōu)先回收垃圾最多的區(qū)域佑笋。區(qū)域劃分和優(yōu)先級區(qū)域回收機制翼闹,確保 G1 收集器可以在有限時間獲得最高的垃圾收集效率。

感謝諸君的觀看蒋纬,文中如有紕漏猎荠,歡迎在評論區(qū)來交流。如果這篇文章幫助到了你蜀备,歡迎點贊??關注关摇。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市琼掠,隨后出現(xiàn)的幾起案子拒垃,更是在濱河造成了極大的恐慌,老刑警劉巖瓷蛙,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件悼瓮,死亡現(xiàn)場離奇詭異,居然都是意外死亡艰猬,警方通過查閱死者的電腦和手機横堡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來冠桃,“玉大人命贴,你說我怎么就攤上這事。” “怎么了胸蛛?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵污茵,是天一觀的道長。 經(jīng)常有香客問我葬项,道長泞当,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任民珍,我火速辦了婚禮襟士,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘嚷量。我一直安慰自己陋桂,他們只是感情好,可當我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布蝶溶。 她就那樣靜靜地躺著嗜历,像睡著了一般。 火紅的嫁衣襯著肌膚如雪抖所。 梳的紋絲不亂的頭發(fā)上秸脱,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天,我揣著相機與錄音部蛇,去河邊找鬼。 笑死咐蝇,一個胖子當著我的面吹牛涯鲁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼镰烧!你這毒婦竟也來了翅楼?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤飞苇,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體肩祥,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年缩膝,在試婚紗的時候發(fā)現(xiàn)自己被綠了混狠。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡疾层,死狀恐怖将饺,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤予弧,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布刮吧,位于F島的核電站,受9級特大地震影響掖蛤,放射性物質(zhì)發(fā)生泄漏杀捻。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一坠七、第九天 我趴在偏房一處隱蔽的房頂上張望水醋。 院中可真熱鬧,春花似錦彪置、人聲如沸拄踪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽惶桐。三九已至,卻和暖如春潘懊,著一層夾襖步出監(jiān)牢的瞬間姚糊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工授舟, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留救恨,地道東北人。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓释树,卻偏偏與公主長得像肠槽,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子奢啥,可洞房花燭夜當晚...
    茶點故事閱讀 44,601評論 2 353

推薦閱讀更多精彩內(nèi)容