Java GC全集(五):GC 算法實(shí)現(xiàn)篇(二)并行GC

本文來自于HeapDump性能社區(qū)缩歪! !有性能問題谍憔,上HeapDump性能社區(qū)匪蝙!
正文:

Parallel GC(并行GC)

并行垃圾收集器這一類組合, 在年輕代使用 標(biāo)記-復(fù)制(mark-copy)算法, 在老年代使用 標(biāo)記-清除-整理(mark-sweep-compact)算法。年輕代和老年代的垃圾回收都會觸發(fā)STW事件,暫停所有的應(yīng)用線程來執(zhí)行垃圾收集习贫。兩者在執(zhí)行 標(biāo)記和 復(fù)制/整理階段時(shí)都使用多個(gè)線程, 因此得名“(Parallel)”逛球。通過并行執(zhí)行, 使得GC時(shí)間大幅減少。

通過命令行參數(shù) -XX:ParallelGCThreads=NNN 來指定 GC 線程數(shù)苫昌。 其默認(rèn)值為CPU內(nèi)核數(shù)颤绕。

可以通過下面的任意一組命令行參數(shù)來指定并行GC:

java -XX:+UseParallelGC com.mypackages.MyExecutableClass
java -XX:+UseParallelOldGC com.mypackages.MyExecutableClass
java -XX:+UseParallelGC -XX:+UseParallelOldGC com.mypackages.MyExecutableClass

并行垃圾收集器適用于多核服務(wù)器,主要目標(biāo)是增加吞吐量。因?yàn)閷ο到y(tǒng)資源的有效使用,能達(dá)到更高的吞吐量:

  • 在GC期間, 所有 CPU 內(nèi)核都在并行清理垃圾, 所以暫停時(shí)間更短
  • 在兩次GC周期的間隔期, 沒有GC線程在運(yùn)行,不會消耗任何系統(tǒng)資源

另一方面, 因?yàn)榇薌C的所有階段都不能中斷, 所以并行GC很容易出現(xiàn)長時(shí)間的卡頓. 如果延遲是系統(tǒng)的主要目標(biāo), 那么就應(yīng)該選擇其他垃圾收集器組合。

注: 長時(shí)間卡頓的意思是奥务,此GC啟動之后物独,屬于一次性完成所有操作, 于是單次 pause 的時(shí)間會較長。

讓我們看看并行垃圾收集器的GC日志長什么樣, 從中我們可以得到哪些有用信息氯葬。下面的GC日志中顯示了一次 minor GC 暫停 和一次 major GC 暫停:

1 ****-05-26T14:27:40.915-0200: 116.115: [GC (Allocation Failure) 
2       [PSYoungGen: 2694440K->1305132K(2796544K)] 
3    9556775K->8438926K(11185152K)
4    , 0.2406675 secs] 
5    [Times: user=1.77 sys=0.01, real=0.24 secs]
6  ****-05-26T14:27:41.155-0200: 116.356: [Full GC (Ergonomics) 
7       [PSYoungGen: 1305132K->0K(2796544K)] 
8       [ParOldGen: 7133794K->6597672K(8388608K)] 8438926K->6597672K(11185152K), 
9      [Metaspace: 6745K->6745K(1056768K)]
10    , 0.9158801 secs]
11   [Times: user=4.49 sys=0.64, real=0.92 secs]

Minor GC(小型GC)

第一次GC事件表示發(fā)生在年輕代的垃圾收集:

****-05-26T14:27:40.915-02001: 116.1152: [ GC3 (Allocation Failure4)
[PSYoungGen5: 2694440K->1305132K6 (2796544K)7] 9556775K->8438926K8
(11185152K)9, 0.2406675 secs10]
[Times: user=1.77 sys=0.01, real=0.24 secs]11

>

  1. ****-05-26T14:27:40.915-0200 – GC事件開始的時(shí)間. 其中-0200表示西二時(shí)區(qū),而中國所在的東8區(qū)為 +0800挡篓。
  2. 116.115 – GC事件開始時(shí),相對于JVM啟動時(shí)的間隔時(shí)間,單位是秒。
  3. GC – 用來區(qū)分 Minor GC 還是 Full GC 的標(biāo)志帚称。GC表明這是一次小型GC(Minor GC)
  4. Allocation Failure – 觸發(fā)垃圾收集的原因瞻凤。本次GC事件, 是由于年輕代中沒有適當(dāng)?shù)目臻g存放新的數(shù)據(jù)結(jié)構(gòu)引起的。
  5. PSYoungGen – 垃圾收集器的名稱世杀。這個(gè)名字表示的是在年輕代中使用的: 并行的 標(biāo)記-復(fù)制(mark-copy), 全線暫停(STW) 垃圾收集器阀参。
  6. 2694440K->1305132K – 在垃圾收集之前和之后的年輕代使用量。
  7. (2796544K) – 年輕代的總大小瞻坝。
  8. 9556775K->8438926K – 在垃圾收集之前和之后整個(gè)堆內(nèi)存的使用量蛛壳。
  9. (11185152K) – 可用堆的總大小。
  10. 0.2406675 secs – GC事件持續(xù)的時(shí)間,以秒為單位所刀。
  11. [Times: user=1.77 sys=0.01, real=0.24 secs] – GC事件的持續(xù)時(shí)間, 通過三個(gè)部分來衡量:
  • user – 在此次垃圾回收過程中, 由GC線程所消耗的總的CPU時(shí)間衙荐。
  • sys – GC過程中中操作系統(tǒng)調(diào)用和系統(tǒng)等待事件所消耗的時(shí)間。
  • real – 應(yīng)用程序暫停的時(shí)間浮创。在 Parallel GC 中, 這個(gè)數(shù)字約等于: (user time + system time)/GC線程數(shù)忧吟。 這里使用了8個(gè)線程。 請注意,總有一定比例的處理過程是不能并行進(jìn)行的斩披。

所以,可以簡單地算出, 在垃圾收集之前, 堆內(nèi)存總使用量為 9,556,775K溜族。 其中年輕代為 2,694,440K。同時(shí)算出老年代使用量為 6,862,335K. 在垃圾收集之后, 年輕代使用量減少為 1,389,308K, 但總的堆內(nèi)存使用量只減少了 1,117,849K垦沉。這表示有大小為 271,459K 的對象從年輕代提升到老年代煌抒。

122.png

Full GC(完全GC)

學(xué)習(xí)了并行GC如何清理年輕代之后, 下面介紹清理整個(gè)堆內(nèi)存的GC日志以及如何進(jìn)行分析:

****-05-26T14:27:41.155-0200 : 116.356 : [Full GC (Ergonomics)
[PSYoungGen: 1305132K->0K(2796544K)] [ParOldGen :7133794K->6597672K
(8388608K)] 8438926K->6597672K (11185152K),
[Metaspace: 6745K->6745K(1056768K)], 0.9158801 secs,
[Times: user=4.49 sys=0.64, real=0.92 secs]
  1. ****-05-26T14:27:41.155-0200 – GC事件開始的時(shí)間. 其中-0200表示西二時(shí)區(qū),而中國所在的東8區(qū)為 +0800
  2. 116.356 – GC事件開始時(shí),相對于JVM啟動時(shí)的間隔時(shí)間,單位是秒厕倍。 我們可以看到, 此次事件在前一次 MinorGC完成之后立刻就開始了寡壮。
  3. Full GC – 用來表示此次是 Full GC 的標(biāo)志。Full GC表明本次清理的是年輕代和老年代讹弯。
  4. Ergonomics – 觸發(fā)垃圾收集的原因况既。Ergonomics 表示JVM內(nèi)部環(huán)境認(rèn)為此時(shí)可以進(jìn)行一次垃圾收集。
  5. [PSYoungGen: 1305132K->0K(2796544K)] – 和上面的示例一樣, 清理年輕代的垃圾收集器是名為 “PSYoungGen” 的STW收集器, 采用標(biāo)記-復(fù)制(mark-copy)算法组民。 年輕代使用量從 1305132K 變?yōu)?0, 一般 Full GC 的結(jié)果都是這樣棒仍。
  6. ParOldGen – 用于清理老年代空間的垃圾收集器類型。在這里使用的是名為 ParOldGen 的垃圾收集器, 這是一款并行 STW垃圾收集器, 算法為 標(biāo)記-清除-整理(mark-sweep-compact)邪乍。
  7. 7133794K->6597672K – 在垃圾收集之前和之后老年代內(nèi)存的使用情況降狠。
  8. (8388608K) – 老年代的總空間大小对竣。
  9. 8438926K->6597672K – 在垃圾收集之前和之后堆內(nèi)存的使用情況。
  10. (11185152K) – 可用堆內(nèi)存的總?cè)萘俊?/li>
  11. [Metaspace: 6745K->6745K(1056768K)] – 類似的信息,關(guān)于 Metaspace 空間的榜配》裎常可以看出, 在GC事件中 Metaspace 里面沒有回收任何對象。
  12. 0.9158801 secs – GC事件持續(xù)的時(shí)間,以秒為單位蛋褥。
  13. [Times: user=4.49 sys=0.64, real=0.92 secs] – GC事件的持續(xù)時(shí)間, 通過三個(gè)部分來衡量:
  • user – 在此次垃圾回收過程中, 由GC線程所消耗的總的CPU時(shí)間临燃。
  • sys – GC過程中中操作系統(tǒng)調(diào)用和系統(tǒng)等待事件所消耗的時(shí)間。
  • real – 應(yīng)用程序暫停的時(shí)間烙心。在 Parallel GC 中, 這個(gè)數(shù)字約等于: (user time + system time)/GC線程數(shù)膜廊。 這里使用了8個(gè)線程。 請注意,總有一定比例的處理過程是不能并行進(jìn)行的淫茵。

同樣,和 Minor GC 的區(qū)別是很明顯的 —— 在此次GC事件中, 除了年輕代, 還清理了老年代和 Metaspace. 在GC事件前后的內(nèi)存布局如下圖所示:

v2-e837dba149fd2268ea06d6dc868f63cb_1440w.png

在本手冊中,我們將介紹JVM中垃圾收集的實(shí)現(xiàn)原理爪瓜,以及如何高效地利用GC。
第一篇:什么是垃圾回收匙瘪?

第二篇:Java 中的垃圾收集原理解析

第三篇:GC算法基礎(chǔ)篇

第四篇:GC 算法實(shí)現(xiàn)篇——串行GC

第五篇:GC 算法實(shí)現(xiàn)篇——并行GC

第六篇:GC 算法實(shí)現(xiàn)篇——并發(fā)標(biāo)記-清除

第七篇:GC 算法實(shí)現(xiàn)篇——垃圾優(yōu)先算法

第八篇:GC 調(diào)優(yōu)基礎(chǔ)篇

第九篇:GC 調(diào)優(yōu)工具篇

第十篇:GC調(diào)優(yōu)實(shí)戰(zhàn)篇—高分配速率(High Allocation Rate)

第十一篇:GC 調(diào)優(yōu)的實(shí)戰(zhàn)篇—過早提升(Premature Promotion)

第十二篇:GC 調(diào)優(yōu)的實(shí)戰(zhàn)篇—Weak, Soft 及 Phantom 引用

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末铆铆,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子丹喻,更是在濱河造成了極大的恐慌薄货,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,589評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件碍论,死亡現(xiàn)場離奇詭異谅猾,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)鳍悠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評論 3 396
  • 文/潘曉璐 我一進(jìn)店門税娜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人贼涩,你說我怎么就攤上這事巧涧。” “怎么了遥倦?”我有些...
    開封第一講書人閱讀 165,933評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長占锯。 經(jīng)常有香客問我袒哥,道長,這世上最難降的妖魔是什么消略? 我笑而不...
    開封第一講書人閱讀 58,976評論 1 295
  • 正文 為了忘掉前任堡称,我火速辦了婚禮,結(jié)果婚禮上艺演,老公的妹妹穿的比我還像新娘却紧。我一直安慰自己桐臊,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評論 6 393
  • 文/花漫 我一把揭開白布晓殊。 她就那樣靜靜地躺著断凶,像睡著了一般。 火紅的嫁衣襯著肌膚如雪巫俺。 梳的紋絲不亂的頭發(fā)上认烁,一...
    開封第一講書人閱讀 51,775評論 1 307
  • 那天,我揣著相機(jī)與錄音介汹,去河邊找鬼却嗡。 笑死,一個(gè)胖子當(dāng)著我的面吹牛嘹承,可吹牛的內(nèi)容都是我干的窗价。 我是一名探鬼主播,決...
    沈念sama閱讀 40,474評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼叹卷,長吁一口氣:“原來是場噩夢啊……” “哼舌镶!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起豪娜,我...
    開封第一講書人閱讀 39,359評論 0 276
  • 序言:老撾萬榮一對情侶失蹤餐胀,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后瘤载,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體否灾,經(jīng)...
    沈念sama閱讀 45,854評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評論 3 338
  • 正文 我和宋清朗相戀三年鸣奔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了墨技。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,146評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡挎狸,死狀恐怖扣汪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情锨匆,我是刑警寧澤崭别,帶...
    沈念sama閱讀 35,826評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站恐锣,受9級特大地震影響茅主,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜土榴,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評論 3 331
  • 文/蒙蒙 一诀姚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧玷禽,春花似錦赫段、人聲如沸呀打。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽贬丛。三九已至,卻和暖如春炬丸,著一層夾襖步出監(jiān)牢的瞬間瘫寝,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評論 1 272
  • 我被黑心中介騙來泰國打工稠炬, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留焕阿,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,420評論 3 373
  • 正文 我出身青樓首启,卻偏偏與公主長得像暮屡,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子毅桃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評論 2 356

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