JVM---- 垃圾收集器

HotSpot JVM收集器

上面有7中收集器,分為兩塊双抽,上面為新生代收集器百框,下面是老年代收集器。如果兩個(gè)收集器之間存在連線牍汹,就說(shuō)明它們可以搭配使用铐维。

Serial(串行GC)收集器

Serial收集器是一個(gè)新生代收集器,單線程執(zhí)行慎菲,使用復(fù)制算法嫁蛇。它在進(jìn)行垃圾收集時(shí),必須暫停其他所有的工作線程(用戶線程)露该。是Jvm client模式下默認(rèn)的新生代收集器睬棚。對(duì)于限定單個(gè)CPU的環(huán)境來(lái)說(shuō),Serial收集器由于沒(méi)有線程交互的開銷解幼,專心做垃圾收集自然可以獲得最高的單線程收集效率抑党。

ParNew(并行GC)收集器

ParNew收集器其實(shí)就是serial收集器的多線程版本,除了使用多條線程進(jìn)行垃圾收集之外撵摆,其余行為與Serial收集器一樣底靠。

Parallel Scavenge(并行回收GC)收集器

Parallel Scavenge收集器也是一個(gè)新生代收集器,它也是使用復(fù)制算法的收集器特铝,又是并行多線程收集器暑中。parallel Scavenge收集器的特點(diǎn)是它的關(guān)注點(diǎn)與其他收集器不同,CMS等收集器的關(guān)注點(diǎn)是盡可能地縮短垃圾收集時(shí)用戶線程的停頓時(shí)間苟呐,而parallel Scavenge收集器的目標(biāo)則是達(dá)到一個(gè)可控制的吞吐量痒芝。吞吐量= 程序運(yùn)行時(shí)間/(程序運(yùn)行時(shí)間 + 垃圾收集時(shí)間)俐筋,虛擬機(jī)總共運(yùn)行了100分鐘牵素。其中垃圾收集花掉1分鐘,那吞吐量就是99%澄者。

Serial Old(串行GC)收集器

Serial Old是Serial收集器的老年代版本笆呆,它同樣使用一個(gè)單線程執(zhí)行收集,使用“標(biāo)記-整理”算法粱挡。主要使用在Client模式下的虛擬機(jī)赠幕。

Parallel Old(并行GC)收集器

Parallel Old是Parallel Scavenge收集器的老年代版本,使用多線程和“標(biāo)記-整理”算法询筏。

CMS(并發(fā)GC)收集器

CMS(Concurrent Mark Sweep)收集器是一種以獲取最短回收停頓時(shí)間為目標(biāo)的收集器榕堰。

CMS收集器是基于“標(biāo)記-清除”算法實(shí)現(xiàn)的,整個(gè)收集過(guò)程大致分為4個(gè)步驟:

①.初始標(biāo)記(CMS initial mark)

②.并發(fā)標(biāo)記(CMS concurrenr mark)

③.重新標(biāo)記(CMS remark)

④.并發(fā)清除(CMS concurrent sweep)

其中初始標(biāo)記、重新標(biāo)記這兩個(gè)步驟任然需要停頓其他用戶線程逆屡。初始標(biāo)記僅僅只是標(biāo)記出GC ROOTS能直接關(guān)聯(lián)到的對(duì)象圾旨,速度很快,并發(fā)標(biāo)記階段是進(jìn)行GC ROOTS 根搜索算法階段魏蔗,會(huì)判定對(duì)象是否存活砍的。而重新標(biāo)記階段則是為了修正并發(fā)標(biāo)記期間,因用戶程序繼續(xù)運(yùn)行而導(dǎo)致標(biāo)記產(chǎn)生變動(dòng)的那一部分對(duì)象的標(biāo)記記錄莺治,這個(gè)階段的停頓時(shí)間會(huì)被初始標(biāo)記階段稍長(zhǎng)廓鞠,但比并發(fā)標(biāo)記階段要短。

由于整個(gè)過(guò)程中耗時(shí)最長(zhǎng)的并發(fā)標(biāo)記和并發(fā)清除過(guò)程中谣旁,收集器線程都可以與用戶線程一起工作床佳,所以整體來(lái)說(shuō),CMS收集器的內(nèi)存回收過(guò)程是與用戶線程一起并發(fā)執(zhí)行的榄审。

CMS收集器的優(yōu)點(diǎn):并發(fā)收集夕土、低停頓,但是CMS還遠(yuǎn)遠(yuǎn)達(dá)不到完美瘟判,主要有三個(gè)顯著缺點(diǎn):

1怨绣,CMS收集器對(duì)CPU資源非常敏感。在并發(fā)階段拷获,雖然不會(huì)導(dǎo)致用戶線程停頓篮撑,但是會(huì)占用CPU資源而導(dǎo)致引用程序變慢,總吞吐量下降匆瓜。CMS默認(rèn)啟動(dòng)的回收線程數(shù)是:(CPU數(shù)量+3) / 4赢笨。

2,CMS收集器無(wú)法處理浮動(dòng)垃圾驮吱,可能出現(xiàn)“Concurrent Mode Failure“茧妒,失敗后而導(dǎo)致另一次Full GC的產(chǎn)生。由于CMS并發(fā)清理階段用戶線程還在運(yùn)行左冬,伴隨程序的運(yùn)行自熱會(huì)有新的垃圾不斷產(chǎn)生桐筏,這一部分垃圾出現(xiàn)在標(biāo)記過(guò)程之后,CMS無(wú)法在本次收集中處理它們拇砰,只好留待下一次GC時(shí)將其清理掉梅忌。這一部分垃圾稱為“浮動(dòng)垃圾”。也是由于在垃圾收集階段用戶線程還需要運(yùn)行除破,,即需要預(yù)留足夠的內(nèi)存空間給用戶線程使用牧氮,因此CMS收集器不能像其他收集器那樣等到老年代幾乎完全被填滿了再進(jìn)行收集,需要預(yù)留一部分內(nèi)存空間提供并發(fā)收集時(shí)的程序運(yùn)作使用瑰枫。

在默認(rèn)設(shè)置下踱葛,CMS收集器在老年代使用了68%的空間時(shí)就會(huì)被激活,也可以通過(guò)參數(shù)-XX:CMSInitiatingOccupancyFraction的值來(lái)提供觸發(fā)百分比,以降低內(nèi)存回收次數(shù)提高性能尸诽。要是CMS運(yùn)行期間預(yù)留的內(nèi)存無(wú)法滿足程序其他線程需要圾笨,就會(huì)出現(xiàn)“Concurrent Mode Failure”失敗,這時(shí)候虛擬機(jī)將啟動(dòng)后備預(yù)案:臨時(shí)啟用Serial Old收集器來(lái)重新進(jìn)行老年代的垃圾收集逊谋,這樣停頓時(shí)間就很長(zhǎng)了擂达。

所以說(shuō)參數(shù)-XX:CMSInitiatingOccupancyFraction設(shè)置的過(guò)高將會(huì)很容易導(dǎo)致“Concurrent Mode Failure”失敗,性能反而降低胶滋。

3板鬓,最后一個(gè)缺點(diǎn),CMS是基于“標(biāo)記-清除”算法實(shí)現(xiàn)的收集器究恤,使用“標(biāo)記-清除”算法收集后俭令,會(huì)產(chǎn)生大量碎片〔克蓿空間碎片太多時(shí)抄腔,將會(huì)給對(duì)象分配帶來(lái)很多麻煩,比如說(shuō)大對(duì)象理张,內(nèi)存空間找不到連續(xù)的空間來(lái)分配不得不提前觸發(fā)一次Full GC赫蛇。為了解決這個(gè)問(wèn)題,CMS收集器提供了一個(gè)-XX:UseCMSCompactAtFullCollection開關(guān)參數(shù)雾叭,用于在Full GC之后增加一個(gè)碎片整理過(guò)程悟耘,還可通過(guò)-XX:CMSFullGCBeforeCompaction參數(shù)設(shè)置執(zhí)行多少次不壓縮的Full GC之后,跟著來(lái)一次碎片整理過(guò)程织狐。

G1收集器

G1(Garbage First)收集器是JDK1.7提供的一個(gè)新收集器暂幼,G1收集器基于“標(biāo)記-整理”算法實(shí)現(xiàn),也就是說(shuō)不會(huì)產(chǎn)生內(nèi)存碎片移迫。還有一個(gè)特點(diǎn)之前的收集器進(jìn)行收集的范圍都是整個(gè)新生代或老年代旺嬉,而G1將整個(gè)Java堆(包括新生代,老年代)厨埋。

垃圾收集器參數(shù)總結(jié):

-XX:+ 啟用選項(xiàng) -XX:- 不啟用選項(xiàng) -XX:= -XX:=

參數(shù) 描述 -XX:+UseSerialGC Jvm運(yùn)行在Client模式下的默認(rèn)值邪媳,打開此開關(guān)后,使用Serial + Serial Old的收集器組合進(jìn)行內(nèi)存回收 -XX:+UseParNewGC 打開此開關(guān)后揽咕,使用ParNew + Serial Old的收集器進(jìn)行垃圾回收 -XX:+UseConcMarkSweepGC 使用ParNew + CMS + Serial Old的收集器組合進(jìn)行內(nèi)存回收悲酷,Serial Old作為CMS出現(xiàn)“Concurrent Mode Failure”失敗后的后備收集器使用套菜。 -XX:+UseParallelGC Jvm運(yùn)行在Server模式下的默認(rèn)值亲善,打開此開關(guān)后,使用Parallel Scavenge + Serial Old的收集器組合進(jìn)行回收 -XX:+UseParallelOldGC 使用Parallel Scavenge + Parallel Old的收集器組合進(jìn)行回收 -XX:SurvivorRatio 新生代中Eden區(qū)域與Survivor區(qū)域的容量比值逗柴,默認(rèn)為8蛹头,代表Eden:Subrvivor = 8:1 -XX:PretenureSizeThreshold 直接晉升到老年代對(duì)象的大小,設(shè)置這個(gè)參數(shù)后,大于這個(gè)參數(shù)的對(duì)象將直接在老年代分配 -XX:MaxTenuringThreshold 晉升到老年代的對(duì)象年齡渣蜗,每次Minor GC之后屠尊,年齡就加1,當(dāng)超過(guò)這個(gè)參數(shù)的值時(shí)進(jìn)入老年代 -XX:UseAdaptiveSizePolicy 動(dòng)態(tài)調(diào)整java堆中各個(gè)區(qū)域的大小以及進(jìn)入老年代的年齡 -XX:+HandlePromotionFailure 是否允許新生代收集擔(dān)保耕拷,進(jìn)行一次minor gc后, 另一塊Survivor空間不足時(shí)讼昆,將直接會(huì)在老年代中保留 -XX:ParallelGCThreads 設(shè)置并行GC進(jìn)行內(nèi)存回收的線程數(shù) -XX:GCTimeRatio GC時(shí)間占總時(shí)間的比列,默認(rèn)值為99骚烧,即允許1%的GC時(shí)間浸赫,僅在使用Parallel Scavenge 收集器時(shí)有效 -XX:MaxGCPauseMillis 設(shè)置GC的最大停頓時(shí)間,在Parallel Scavenge 收集器下有效 -XX:CMSInitiatingOccupancyFraction 設(shè)置CMS收集器在老年代空間被使用多少后出發(fā)垃圾收集赃绊,默認(rèn)值為68%既峡,僅在CMS收集器時(shí)有效,-XX:CMSInitiatingOccupancyFraction=70 -XX:+UseCMSCompactAtFullCollection 由于CMS收集器會(huì)產(chǎn)生碎片碧查,此參數(shù)設(shè)置在垃圾收集器后是否需要一次內(nèi)存碎片整理過(guò)程运敢,僅在CMS收集器時(shí)有效 -XX:+CMSFullGCBeforeCompaction 設(shè)置CMS收集器在進(jìn)行若干次垃圾收集后再進(jìn)行一次內(nèi)存碎片整理過(guò)程,通常與UseCMSCompactAtFullCollection參數(shù)一起使用 -XX:+UseFastAccessorMethods 原始類型優(yōu)化 -XX:+DisableExplicitGC 是否關(guān)閉手動(dòng)System.gc -XX:+CMSParallelRemarkEnabled 降低標(biāo)記停頓 -XX:LargePageSizeInBytes 內(nèi)存頁(yè)的大小不可設(shè)置過(guò)大忠售,會(huì)影響Perm的大小传惠,-XX:LargePageSizeInBytes=128m

Client、Server模式默認(rèn)GC

新生代GC方式 老年代和持久代GC方式

新生代GC方式 老年代和持久代GC方式

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末稻扬,一起剝皮案震驚了整個(gè)濱河市涉枫,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌腐螟,老刑警劉巖愿汰,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異乐纸,居然都是意外死亡衬廷,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門汽绢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)吗跋,“玉大人,你說(shuō)我怎么就攤上這事宁昭〉穑” “怎么了?”我有些...
    開封第一講書人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵积仗,是天一觀的道長(zhǎng)疆拘。 經(jīng)常有香客問(wèn)我,道長(zhǎng)寂曹,這世上最難降的妖魔是什么哎迄? 我笑而不...
    開封第一講書人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任回右,我火速辦了婚禮,結(jié)果婚禮上漱挚,老公的妹妹穿的比我還像新娘翔烁。我一直安慰自己,他們只是感情好旨涝,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開白布蹬屹。 她就那樣靜靜地躺著,像睡著了一般白华。 火紅的嫁衣襯著肌膚如雪哩治。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,737評(píng)論 1 305
  • 那天衬鱼,我揣著相機(jī)與錄音业筏,去河邊找鬼。 笑死鸟赫,一個(gè)胖子當(dāng)著我的面吹牛蒜胖,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播抛蚤,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼台谢,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了岁经?” 一聲冷哼從身側(cè)響起朋沮,我...
    開封第一講書人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎缀壤,沒(méi)想到半個(gè)月后樊拓,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡塘慕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年筋夏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片图呢。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡条篷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蛤织,到底是詐尸還是另有隱情赴叹,我是刑警寧澤,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布指蚜,位于F島的核電站乞巧,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏姚炕。R本人自食惡果不足惜摊欠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一丢烘、第九天 我趴在偏房一處隱蔽的房頂上張望柱宦。 院中可真熱鬧些椒,春花似錦、人聲如沸掸刊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)忧侧。三九已至石窑,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蚓炬,已是汗流浹背松逊。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留肯夏,地道東北人经宏。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像驯击,于是被迫代替她去往敵國(guó)和親烁兰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355

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

  • 如果說(shuō)收集算法是內(nèi)存回收的方法論徊都,那么垃圾收集器就是內(nèi)存回收的具體實(shí)現(xiàn)沪斟。 Java虛擬機(jī)規(guī)范中對(duì)垃圾收集器應(yīng)該如何...
    Rick617閱讀 423評(píng)論 0 0
  • 一、判斷對(duì)象的狀態(tài) 在垃圾收集器對(duì)堆進(jìn)行回收前暇矫,要先確定對(duì)象的狀態(tài):是還存活著主之,還是已經(jīng)死去。 引用計(jì)數(shù)算法做法:...
    maxwellyue閱讀 489評(píng)論 0 1
  • 聲明:此篇文章是讀《深入理解JAVA虛擬機(jī)》的筆記 1. 對(duì)象已死李根? ??堆中幾乎存放著Java中所有的對(duì)象實(shí)例杀餐,...
    cooolboy閱讀 297評(píng)論 0 0
  • 1.垃圾如何確認(rèn) 對(duì)于大多數(shù)語(yǔ)言中判斷對(duì)象是否存活會(huì)采用引用計(jì)數(shù)法:給對(duì)象添加一個(gè)引用計(jì)數(shù)器,當(dāng)有一個(gè)地方引用時(shí)朱巨,...
    冬天里的懶喵閱讀 475評(píng)論 0 4
  • 先說(shuō)12月完成的情況 “把該辦的證都辦了史翘,包括電話卡,銀行卡冀续,駕照(這個(gè)可以回國(guó))啥的 【搞定】 各種拜訪琼讽。閆犁,...
    Ming_Olivia閱讀 293評(píng)論 0 0