国产成人精品18p,天天干成人网,无码专区狠狠躁天天躁,美女脱精光隐私扒开免费观看

java中的垃圾收集器是什么

發(fā)布時(shí)間:2021-09-04 11:55 來(lái)源:億速云 閱讀:0 作者:chen 欄目: 開(kāi)發(fā)技術(shù)

本篇內容介紹了“java中的垃圾收集器是什么”的有關(guān)知識,在實(shí)際案例的操作過(guò)程中,不少人都會(huì )遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學(xué)有所成!

目錄
  • 1.經(jīng)典垃圾收集器

    • 1.1 Serial收集器

    • 1.2 ParNew收集器

    • 1.3 Parallel Scavenge 收集器

    • 1.4 Serial Old 收集器

    • 1.5 Parallel Old 收集器

    • 1.6 CMS 收集器

    • 1.7 Garbage First 收集器

  • 2低延遲垃圾收集器

    • 2.1 Shenandoah收集器

    • 2.2 ZGC收集器

  • 總結

    1.經(jīng)典垃圾收集器

    1.1 Serial收集器

    這個(gè)收集器是一個(gè)單線(xiàn)程工作的收集器,但它的單線(xiàn)程的意義并不僅僅是說(shuō)明他只會(huì )使用一個(gè)處理器或一條收集線(xiàn)程去完成垃圾收集工作,更重要對的是強調在它進(jìn)行垃圾收集時(shí),必須暫停其他所有工作線(xiàn)程,直到它收集結束。

    目前已經(jīng)老無(wú)可用,但有著(zhù)優(yōu)于其他收集器的地方:簡(jiǎn)單而高效

    1.2 ParNew收集器

    ParNew收集器實(shí)質(zhì)上是Serial收集器的多線(xiàn)程并行版本。因為它是除了Serial收集器之外,目前唯一可以與CMS收集器配合工作的收集器,所以在JDK7之前的遺留系統中被作為首選的新生代收集器

    CMS收集器是HotSpot虛擬機中第一款真正意義上支持并發(fā)的垃圾收集器,首次實(shí)現了讓垃圾收集線(xiàn)程與用戶(hù)線(xiàn)程同時(shí)工作。但是當選用CMS作為老年代收集器時(shí),新生代收集器只能選擇使用Serial收集器或者ParNew收集器

    隨著(zhù)垃圾收集器技術(shù)的不斷改進(jìn),G1收集器帶著(zhù)CMS繼承者和代替者的光環(huán)登場(chǎng)。G1收集器是一個(gè)面向全堆的收集器,不需要其他新生代收集器的配合工作

    1.3 Parallel Scavenge 收集器

    Parallel Scavenge收集器也是一款新生代收集器,同樣是基于標記-復制算法實(shí)現的收集器,也可以并行收集的多線(xiàn)程收集器。它的特點(diǎn)是它的關(guān)注點(diǎn)與其他收集器不同。CMS等收集器的關(guān)注點(diǎn)是盡可能地縮短垃圾收集時(shí)用戶(hù)線(xiàn)程的停頓時(shí)間,而Parallel Scavenge收集器的目標則是達到一個(gè)可控制的吞吐量。

    $$

    吞吐量=\frac{運行用戶(hù)代碼時(shí)間}{運行用戶(hù)代碼時(shí)間+運行垃圾收集時(shí)間}

    $$

    提供了兩個(gè)參數用于精確控制吞吐量:

    -XX:MaxGCPauseMillis 參數控制最大垃圾搜集停頓時(shí)間,允許的值是一個(gè)大于0的毫秒數。收集器將盡力保證內存回收花費的時(shí)間不超過(guò)用戶(hù)的設定值。但是設定過(guò)分小的值并不能起到加快回收花費的速度的作用。

    -XX:GCTimeRatio 參數直接設置吞吐量大小,允許的值是一個(gè)大于0小于100的整數。也就是垃圾收集時(shí)間占總時(shí)間的比率。相當于吞吐量的倒數。

    Parallel Scavenge 收集器還有一個(gè)參數:-XX:+UseAdaptiveSizePolicy 這是一個(gè)開(kāi)關(guān)參數,當這個(gè)參數被激活以后,就不需要人工指定新生代的大小,Eden與Survivor區的比例等等。虛擬機會(huì )根據當前系統的運行情況收集性能監控信息,動(dòng)態(tài)調整這些參數。

    1.4 Serial Old 收集器

    Serial Old 是 Serial收集器的老年代版本,同樣是一個(gè)單線(xiàn)程收集器,使用標記-整理算法??赡苡袃煞N用途:1. 在JDK5以及之前的版本中與Parallel Scavenge收集器搭配使用 2. 作為CMS收集器發(fā)生失敗時(shí)的后備預案。

    1.5 Parallel Old 收集器

    Parallel Old 是 Parallel Scavenge收集器的老年代版本,支持多線(xiàn)程并發(fā)收集,基于標記-整理算法實(shí)現,從JDK6版本開(kāi)始提供。在注重吞吐量或者處理器資源較為稀缺的場(chǎng)合,都可以?xún)?yōu)先考慮Parallel Scavenge加Parallel Old收集器這個(gè)組合。

    1.6 CMS 收集器

    CMS收集器是一種以獲取最短回收停頓時(shí)間為目標的收集器,基于標記-清除算法實(shí)現。整個(gè)運作過(guò)程分為4步:

    CMS收集器存在三個(gè)缺點(diǎn):

    1.CMS收集器對處理器資源非常敏感,默認啟動(dòng)的回收線(xiàn)程數為(處理器核心數量+3)/ 4。在并發(fā)階段會(huì )因為占用了一部分線(xiàn)程而導致應用程序變慢,降低總吞吐量。

    為了緩解這種情況虛擬機提供了“增量式并發(fā)收集器”(Incremental Concurrent Mark Sweep/i-CMS)作用是在并發(fā)標記、清理的時(shí)候讓收集器線(xiàn)程、用戶(hù)線(xiàn)程交替運行,盡量減少垃圾收集器線(xiàn)程的獨占資源的時(shí)間,這樣整個(gè)垃圾收集的過(guò)程會(huì )更長(cháng),但是對用戶(hù)程序的影響就會(huì )顯得較少一些,直觀(guān)感受是速度變慢的時(shí)間更多了,但速度下降幅度就沒(méi)有那么明顯。效果一般從jdk7開(kāi)始被聲明為deprecated ,從JDK9發(fā)布后被完全廢棄

    2.由于CMS收集器無(wú)法處理“浮動(dòng)垃圾”(Floating Garbage),有可能出現"Concurrent Mode Failure" 失敗進(jìn)而導致另一完全"Stop The World"的Full GC的產(chǎn)生。

    可以適當調高參數-XX:CMSInitiatingOccu-pancyFraction的值來(lái)提高CMS的觸發(fā)百分比,降低內存回收頻率,獲得更好的性能。如果設置的太高將會(huì )很容易導致大量的并發(fā)失敗產(chǎn)生,性能反而降低

    3.由于基于標記-清除算法,可能在收集結束時(shí)會(huì )有大量的空間碎片產(chǎn)生

    通過(guò)調節:-XX:+UseCMSCompactAtFullCollection開(kāi)關(guān)參數,默認是開(kāi)啟的,從jdk9開(kāi)始廢棄

    *** -XX:CMSFullGCsBeforeCompaction 默認值是0,表示每次進(jìn)入Full GC時(shí)都進(jìn)行碎片整理***

    1.7 Garbage First 收集器

    Garbage First 收集器,簡(jiǎn)稱(chēng) G1收集器,開(kāi)創(chuàng )了收集器面向局部收集的設計思路和基于Region的內存布局形式。是一款主要面向服務(wù)端應用的垃圾收集器??梢悦嫦蚨褍却娴娜魏尾糠謥?lái)組成回收集,衡量的標準不再是它屬于哪個(gè)分代,而是哪塊內存中存放的垃圾數量最多,回收收益最大。G1開(kāi)創(chuàng )的基于Region的堆內存布局是它能夠實(shí)現這個(gè)目標的關(guān)鍵,G1不再堅持固定大小以及固定數量的分代區域劃分,而是把連續的java堆劃分為多個(gè)大小相等的獨立區域(Region),每一個(gè)Region都可以根據需要,扮演新生代的Eden空間、Survivor空間或者老年代空間。

    Region中還有一類(lèi)特殊的Humongous區域,專(zhuān)門(mén)用來(lái)存儲大對象。G1認為只要大小超過(guò)了Region容量一半的對象就可以判定為大對象。每個(gè)Region的大小可以通過(guò)參數-XX:G1HeapRegionSize設定,取值范圍為1MB~32MB。

    G1收集器之所以可以建立可預測的停頓時(shí)間模型,是因為它將Region作為單次回收的最小單元,即每次收集到的內存空間都是Region大小的整數倍,這樣可以有計劃地避免在整個(gè)JAVA堆中進(jìn)行全區域的垃圾收集。更具體的思路是讓G1收集器區跟蹤各個(gè)Region里面的垃圾堆積的價(jià)值大小,價(jià)值即回收所獲得的空間大小以及回收所需要的時(shí)間的經(jīng)驗值,然后在后臺 維護一個(gè)優(yōu)先級列表,每次根據用戶(hù)設定允許的收集停頓時(shí)間(-XX:MaxGCPauseMillis)優(yōu)先處理回收價(jià)值收益最大的那些Region。

    G1的記憶集在存儲結構的本質(zhì)上是一種哈希表,Key是別的Region的起始地址,Value是一個(gè)集合,里面存儲的元素是卡表的索引號。G1收集器通過(guò)原始快照(SATB)算法實(shí)現了保證其不能打破原本的對象圖結構的目的。

    G1收集器運作過(guò)程大致分為四個(gè)步驟:

    2低延遲垃圾收集器

    2.1 Shenandoah收集器

    Shenandoah收集器是一款只有OpenJDK才會(huì )包含的。與G1收集器相比,它們兩者有著(zhù)相似的堆內存布局,在初始標記、并發(fā)標記等許多階段的處理思路上都高度一致。但是在管理內存堆方面,與G1收集器至少有三個(gè)方面的明顯的不同之處:

    1.支持并發(fā)的整理算法:G1的回收階段是可以多線(xiàn)程并行的,但不能與用戶(hù)線(xiàn)程并發(fā)。Shenandoah后面會(huì )講到。

    2.Shenandoah收集器默認不使用分代收集。

    3.Shenandoah摒棄了在G1中耗費大量?jì)却婧陀嬎阗Y源去維護的記憶集,改名為“連接矩陣”(Connection Matrix)的全局數據結構來(lái)記錄跨Region的引用關(guān)系。降低了處理跨代指針的記憶集維護消耗,也降低了偽共享問(wèn)題發(fā)生的概率

    Shenandoah收集器大致工作流程可以分為9個(gè)階段:

    Brooks Points:Brooks是一個(gè)人的名字,它提出使用了轉發(fā)指針(Forwarding Pointer)的技術(shù)來(lái)實(shí)現對象移動(dòng)與用戶(hù)程序并發(fā)的一種解決方案。不需要用到內存保護陷阱,而是在原有對象布局結構的最前面統一增加一個(gè)新的引用字段,在正常不處于并發(fā)移動(dòng)的情況下,該引用指向對象自己。實(shí)際上Shenandoah收集器是通過(guò)比較并交換(Compare And Swap, CAS)操作來(lái)保證并發(fā)時(shí)對象的訪(fǎng)問(wèn)正確性的。

    JDK13中Shenandoah的內存屏障模型改進(jìn)為基于引用訪(fǎng)問(wèn)屏障(Load Reference Barrier)的實(shí)現,所謂“引用訪(fǎng)問(wèn)屏障”是指內存屏障只攔截對象中數據類(lèi)型為引用類(lèi)型的讀寫(xiě)操作,而不去管原生數據類(lèi)型等其他非引用字段的讀寫(xiě)。這能省去大量對原生類(lèi)型、對象比較、對象加鎖等場(chǎng)景中設置內存屏障所帶來(lái)的消耗。

    2.2 ZGC收集器

    ZGC收集器是一款基于Region內存布局的,暫時(shí)不設分代的,使用了讀屏障、染色指針和內存多重映射等技術(shù)來(lái)實(shí)現可并發(fā)的標記-整理算法的,以低延遲為首要目標的一款垃圾收集器。

    ZGC的Region具有動(dòng)態(tài)性-動(dòng)態(tài)創(chuàng )建和銷(xiāo)毀,以及動(dòng)態(tài)的區域容量大小。

    染色指針(Colored Pointer):一種直接將少量額外的信息存儲在指針上的技術(shù)。盡管在linux下64位指針的高18位不能用來(lái)尋址,但是剩余的46位所能支持的64TB內存仍然能夠充分滿(mǎn)足需要。鑒于此,將其高4位提取出來(lái)存儲四個(gè)標記信息。通過(guò)這些標志位,虛擬機可以直接從指針中看到其引用對象的三色標記狀態(tài)、是否進(jìn)入了重分配集、是否只能通過(guò)finalize( )方法才能被訪(fǎng)問(wèn)到。也使得ZGC能夠管理的內存不可以超過(guò)4TB。使用染色指針的三大優(yōu)勢:

    1.可以使得一旦某個(gè)Region的存活對象被移走之后,這個(gè)Region立即就能被釋放和重用掉,不必等待整個(gè)堆中所有指向該Region的引用都被修正后才能清理。

    2.可以大幅度減少在垃圾收集過(guò)程中的內存屏障的使用數量。到目前為止,ZGC都未使用寫(xiě)屏障,只使用了讀屏障。

    3.可以作為一種可擴展的存儲結構用來(lái)記錄更多與對象標記、重定位過(guò)程相關(guān)的數據,以便日后進(jìn)一步提高性能。

    Linux/x86-64平臺上的ZGC使用了多重映射將多個(gè)不同的虛擬內存地址映射到同一個(gè)物理內存地址上,意味著(zhù)ZGC在虛擬內存中看到的地址空間要比實(shí)際的堆內存容量來(lái)得更大。把染色指針中的標志位看作是地址的分段符,只要將這些不同的地址段都映射到同一個(gè)物理內存空間,經(jīng)過(guò)多重映射轉換后,就可以使用染色指針正常進(jìn)行尋址了。

    ZGC的運作過(guò)程(省略部分與之前介紹的G1和Shenandoah相同的小階段部分):

    免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自互聯(lián)網(wǎng)轉載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權請聯(lián)系QQ:712375056 進(jìn)行舉報,并提供相關(guān)證據,一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容。

    久久久综合九色综合88| 免费萌白酱国产一区二区三区| 免费AV片在线观看网址| 亚洲国产精品无码久久sM| 全免费A级毛片| 精品久久久久久久久午夜福利|