国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

JVM內(nèi)存管理------垃圾搜集器簡介

2019-11-11 06:04:38
字體:
供稿:網(wǎng)友

 

        上一章我們已經(jīng)探討過GC的各個算法,那么垃圾搜集器是什么呢?

        通俗的講,使用編程語言將算法實(shí)現(xiàn)出來,產(chǎn)生的程序就是垃圾搜集器了。既然談到了編程語言的實(shí)現(xiàn),那么在討論垃圾搜集器的時候,就已經(jīng)涉及到具體的虛擬機(jī)實(shí)現(xiàn)了。

        或許有不少做java開發(fā)的猿友還不知道,我們平時使用的JDK中,默認(rèn)的JVM是hotspot,換句話說,我們大部分時候使用的JVM都是hotspot的實(shí)現(xiàn)版本,因此,本次LZ討論垃圾搜集器都是基于hotspot版JVM來進(jìn)行的,請各位猿友要知曉這一點(diǎn)。

        更直觀的,我們可以在我們平時開發(fā)的機(jī)子上,輸入java -version來查看JVM的版本,相信大部分猿友對這個命令都不陌生吧,LZ的機(jī)子截圖如下。

         

 

垃圾搜集器的分類

 

        上面我們已經(jīng)提到,垃圾搜集器實(shí)際就是算法的編程語言實(shí)現(xiàn)。既然牽扯到編程語言,那么必然離不開線程,而且我們在前面講解算法的時候也一直假設(shè)是一條GC線程在做著GC的事情。

        因此,垃圾搜集器大致分為以下三類。

        串行搜集器(serial collector):它只有一條GC線程,且就像前面說的,它在運(yùn)行的時候需要暫停用戶程序(stop the world)。

        并行搜集器(parallel collector):它有多條GC線程,且它也需要暫停用戶程序(stop the world)。

        并發(fā)搜集器(concurrent collector):它有一條或多條GC線程,且它需要在部分階段暫停用戶程序(stop the world),部分階段與用戶程序并發(fā)執(zhí)行。

        

并發(fā)(concurrent)與并行(parallel)

        

       看完上面的定義,相信有一部分猿友已經(jīng)蒙了,一會單線程,一會多線程,一會串行,一會并行,一會并發(fā),這都神馬玩意?

       單線程和多線程就不必多說了,這個很好理解,串行與并行也比較好理解,難于分辨的就是并行(parallel)與并發(fā)(concurrent)。

       對于很多有關(guān)并發(fā)的解釋,LZ覺得有一個最貼切。它是這么解釋的,并發(fā)就是兩個任務(wù)A和B需要相互獨(dú)立的運(yùn)行,并且A任務(wù)先開始后,B任務(wù)在A任務(wù)結(jié)束之前開始了。

       并發(fā)本身是比較好理解的,那么它與并行的關(guān)系與區(qū)別是什么呢?

       事實(shí)上,并行是并發(fā)的一種實(shí)現(xiàn)方式。LZ覺得這么說各位可能會更好理解,當(dāng)然,并行并不是并發(fā)的唯一實(shí)現(xiàn)方式,還有一種就是我們所熟悉的時間片切換。也就是A任務(wù)執(zhí)行一會,B任務(wù)執(zhí)行一會,交替執(zhí)行。

       并行必須在多核多處理器或者分布式系統(tǒng)(本質(zhì)還是多核多處理器)的前提下才能發(fā)生,而交替執(zhí)行或者說時間片切換是在單核的處理器上發(fā)生的

 

hotspot中的垃圾搜集器

 

       我們上面已經(jīng)簡單探討了垃圾搜集器的分類,在hotspotJVM中,每一個種類的垃圾搜集器都有對應(yīng)的實(shí)現(xiàn),如下。

       串行搜集器的實(shí)現(xiàn):serial(用于新生代,采用復(fù)制算法)、serial old(用于年老代,采用標(biāo)記/整理算法)

       并行搜集器的實(shí)現(xiàn):ParNew(用于新生代,采用復(fù)制算法)、Parallel Scavenge(用于新生代,采用復(fù)制算法)、Parallel old(用于年老代,采用標(biāo)記/整理算法)

       并發(fā)搜集器的實(shí)現(xiàn):concurrent mark sweep[CMS](用于年老代,采用標(biāo)記/清除算法)

       可以看到,上面每一種垃圾搜集器都是針對不同內(nèi)存區(qū)域所設(shè)計(jì)的,因?yàn)樗鼈儾捎玫乃惴ú煌彩怯糜谛律亩际鞘褂玫膹?fù)制算法,而用于年老代的都是使用的標(biāo)記/清除或者標(biāo)記/整理算法。

       在實(shí)際應(yīng)用中,我們需要給JVM的新生代和年老代分別選擇垃圾搜集器,可以看到無論是新生代還是年老代都分別有三種實(shí)現(xiàn),換句話說,我們應(yīng)該有3*3=9種選擇。但是,事實(shí)并非如此。

       事實(shí)上,這六種垃圾搜集器只有六種選擇,因?yàn)橛械睦鸭饔捎诰唧w實(shí)現(xiàn)的方式等一系列原因無法在一起工作,如下圖。

         針對上圖,紅的就是串行搜集器,綠的是并行搜集器,唯一一個黃的是并發(fā)搜集器。上面三個是新生代的搜集器,下面三個是年老代的搜集器。兩者之間有連線,則表示兩者可以配合工作。

         這六種組合并沒有說哪個組合最強(qiáng),哪個組合最弱,還是那句話,只有最合適的,沒有最好的。因此這就需要我們對每一種組合有一定的認(rèn)識,才能在使用的時候選擇更適合的垃圾搜集器。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 珠海市| 普格县| 三亚市| 肃北| 绥阳县| 达拉特旗| 手游| 自治县| 康平县| 宽甸| 沂水县| 定州市| 兴义市| 综艺| 丹东市| 宁河县| 霍林郭勒市| 喜德县| 成武县| 丰都县| 济阳县| 谷城县| 兴仁县| 虹口区| 体育| 三穗县| 长宁区| 蒲城县| 花垣县| 绵竹市| 仪陇县| 循化| 徐州市| 阿瓦提县| 南京市| 巩留县| 罗甸县| 喀什市| 万州区| 通州区| 高雄市|