亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專(zhuān)欄INFORMATION COLUMN

Java JDK11中令人興奮的ZGC

JasinYip / 1402人閱讀

摘要:在本文中,我們將介紹新的動(dòng)機(jī),技術(shù)概述以及開(kāi)啟的一些非常令人興奮的可能性。虛擬內(nèi)存是抽象,意味著應(yīng)用程序有自己的通常是隔離的視圖到物理內(nèi)存。多映射涉及將不同范圍的虛擬內(nèi)存映射到同一物理內(nèi)存。根中可訪問(wèn)的對(duì)象集稱(chēng)為活動(dòng)集。

Java 11最近已發(fā)布,包含一些非常棒的功能。該版本包含一個(gè)全新的垃圾收集器ZGC,它由Oracle開(kāi)發(fā),承諾在數(shù)TB的堆上具有非常低的暫停時(shí)間。在本文中,我們將介紹新GC的動(dòng)機(jī),技術(shù)概述以及ZGC開(kāi)啟的一些非常令人興奮的可能性。

那么為什么需要新的GC呢?Java 10已經(jīng)搭載了四艘經(jīng)過(guò)多年實(shí)戰(zhàn)測(cè)試且?guī)缀蹩梢詿o(wú)限調(diào)優(yōu)。為了正確看待這一點(diǎn),G1最新的Hotspot GC是在2006年推出的。當(dāng)時(shí)最大的AWS實(shí)例是最初的m1.small包裝1 vCPU和1.7GB內(nèi)存,今天AWS很樂(lè)意租給你一個(gè)x1e.32x大型,128個(gè)vCPU,令人難以置信的3,904GB內(nèi)存的服務(wù)器。ZGC的設(shè)計(jì)針對(duì)這些容量普遍存在的未來(lái):多TB容量,暫停時(shí)間低(<10ms),對(duì)整體應(yīng)用性能有影響(吞吐量 GC術(shù)語(yǔ)

為了理解ZGC在哪里適合現(xiàn)有的收集器,以及它如何能夠做到這一點(diǎn),我們首先需要回顧一些術(shù)語(yǔ)。垃圾收集最基本的工作是確定不再使用的內(nèi)存,并使其可以重用?,F(xiàn)代收藏家是分幾個(gè)階段進(jìn)行這一過(guò)程的,他們往往被描述為:

并行 - 在JVM運(yùn)行時(shí),有應(yīng)用程序線程和垃圾收集器線程。并行階段是由多個(gè)gc線程執(zhí)行的階段,即工作在它們之間分開(kāi)。它沒(méi)有說(shuō)明gc線程是否可能與正在運(yùn)行的應(yīng)用程序線程重疊。

串行 - 串行的階段僅在單個(gè)gc線程上執(zhí)行。與上面的并行一樣,它沒(méi)有說(shuō)明工作是否與當(dāng)前運(yùn)行的應(yīng)用程序線程重疊。

Stop The World - Stop The World階段,應(yīng)用程序線程被暫停,以便gc執(zhí)行其工作。當(dāng)您遇到GC暫停時(shí),這是由于Stop The World階段。

并發(fā) - 如果一個(gè)階段是并發(fā)的,那么GC可以在應(yīng)用程序線程正在進(jìn)行其工作的同時(shí)執(zhí)行其工作。并發(fā)階段很復(fù)雜,因?yàn)樗鼈冃枰軌蛱幚響?yīng)用程序線程,從而可能在階段完成之前使其工作無(wú)效。

增量 - 如果一個(gè)階段是增量的,那么它可以運(yùn)行一段時(shí)間并由于某些條件而提前終止,例如時(shí)間預(yù)算或需要執(zhí)行的更高優(yōu)先級(jí)的gc階段,同時(shí)仍然完成了生產(chǎn)性工作。這與需要完全完成的階段形成鮮明對(duì)比。

固有的權(quán)衡取舍

值得指出的是,所有這些屬性都需要權(quán)衡利弊。例如,并行階段將利用多個(gè)gc線程來(lái)執(zhí)行工作,但這樣做會(huì)導(dǎo)致線程之間協(xié)調(diào)的開(kāi)銷(xiāo)。同樣,并發(fā)階段不會(huì)暫停應(yīng)用程序線程,但可能涉及更多的開(kāi)銷(xiāo)和復(fù)雜性,以處理應(yīng)用程序線程同時(shí)使其工作無(wú)效。

ZGC

現(xiàn)在我們了解不同gc階段的屬性,讓我們探討ZGC的工作原理。為了實(shí)現(xiàn)其目標(biāo),ZGC使用了Hotspot Garbage Collectors的兩種新技術(shù):彩色指針和負(fù)載障礙。

指針著色

指針著色是一種將信息存儲(chǔ)在指針(或Java術(shù)語(yǔ),引用)本身中的技術(shù)。這是可能的,因?yàn)樵?4位平臺(tái)上(ZGC僅為64位),指針可以處理比系統(tǒng)實(shí)際擁有的內(nèi)存更多的內(nèi)存,因此可以使用其他一些位來(lái)存儲(chǔ)狀態(tài)。ZGC將自己限制在需要42位的4Tb堆中,只留下22位可能的狀態(tài),目前它使用4位:finalizable、remap、mark0和mark1。我們稍后會(huì)解釋它們的用途。

指針著色的一個(gè)問(wèn)題是,當(dāng)您需要取消引用指針時(shí),它可以創(chuàng)建額外的工作,因?yàn)槟枰帘蔚粜畔⑽?。像SPARC這樣的平臺(tái)有內(nèi)置硬件支持指針屏蔽所以它不是問(wèn)題,但對(duì)于x86,ZGC團(tuán)隊(duì)使用了一個(gè)簡(jiǎn)潔的多映射技巧。

多重映射

要了解多映射的工作原理,我們需要簡(jiǎn)要解釋虛擬和物理內(nèi)存之間的區(qū)別。物理內(nèi)存是系統(tǒng)可用的實(shí)際內(nèi)存,通常是安裝的DRAM芯片的容量。虛擬內(nèi)存是抽象,意味著應(yīng)用程序有自己的(通常是隔離的)視圖到物理內(nèi)存。操作系統(tǒng)負(fù)責(zé)維護(hù)虛擬內(nèi)存和物理內(nèi)存范圍之間的映射,它通過(guò)使用頁(yè)表和處理器的內(nèi)存管理單元(MMU)和轉(zhuǎn)換后備緩沖區(qū)(TLB)來(lái)實(shí)現(xiàn)這一點(diǎn),后者轉(zhuǎn)換應(yīng)用程序請(qǐng)求的地址。

多映射涉及將不同范圍的虛擬內(nèi)存映射到同一物理內(nèi)存。由于設(shè)計(jì)只有一個(gè)重映射,mark0和MARK-1可以在任何時(shí)間點(diǎn)為1,這是可能的三個(gè)映射做到這一點(diǎn)。ZGC源代碼中有一個(gè)很好的圖表。

負(fù)載障礙

負(fù)載障礙是每當(dāng)應(yīng)用程序線程從堆加載引用時(shí)運(yùn)行的代碼片段(即訪問(wèn)對(duì)象上的非原始字段):

void printName( Person person ) {
    String name = person.name;  // would trigger the load barrier
                                // because we’ve loaded a reference 
                                // from the heap
    System.out.println(name);   // no load barrier directly
}

在上面的代碼中,分配名稱(chēng)的行包括跟隨對(duì)堆上對(duì)象數(shù)據(jù)的person引用,然后將引用加載到它包含的名稱(chēng)。此時(shí)觸發(fā)負(fù)載屏障。觸發(fā)打印到屏幕的第二行不會(huì)直接導(dǎo)致加載障礙觸發(fā),因?yàn)闆](méi)有來(lái)自堆的引用加載 - 名稱(chēng)是局部變量,因此沒(méi)有從堆加載引用。但是,引用System和out,或者println內(nèi)部可能會(huì)觸發(fā)其他負(fù)載障礙。這與其他GC使用的寫(xiě)屏障形成對(duì)比,例如G1。加載屏障的工作是檢查引用的狀態(tài),并在將引用(或者甚至是不同的引用)返回給應(yīng)用程序之前執(zhí)行一些工作。在ZGC中,它通過(guò)測(cè)試加載的引用來(lái)執(zhí)行此任務(wù),以查看是否設(shè)置了某些位,具體取決于當(dāng)前階段。如果引用通過(guò)測(cè)試,則不執(zhí)行任何其他工作,如果失敗,則在將引用返回給應(yīng)用程序之前執(zhí)行某些特定于階段的任務(wù)。

Marking

現(xiàn)在我們了解了這兩種技術(shù)是什么,讓我們看看ZGC GC循環(huán)。循環(huán)的第一部分是標(biāo)記。標(biāo)記涉及到以某種方式查找和標(biāo)記所有堆對(duì)象,這些對(duì)象可以被正在運(yùn)行的應(yīng)用程序訪問(wèn),換句話說(shuō),查找不是垃圾的對(duì)象。

ZGC的標(biāo)記分為三個(gè)階段。第一個(gè)階段是Stop The World階段,在這個(gè)階段中,GC的根被標(biāo)記為存在。GC根類(lèi)似于局部變量,應(yīng)用程序可以使用它訪問(wèn)堆上的其他對(duì)象。如果對(duì)象不能通過(guò)從根開(kāi)始的對(duì)象圖遍歷來(lái)訪問(wèn),那么應(yīng)用程序就無(wú)法訪問(wèn)它,它被認(rèn)為是垃圾。根中可訪問(wèn)的對(duì)象集稱(chēng)為活動(dòng)集。GC根標(biāo)記步驟非常短,因?yàn)楦目倲?shù)通常相對(duì)較小。

一旦該階段完成,應(yīng)用程序?qū)⒗^續(xù),ZGC將開(kāi)始下一個(gè)階段,該階段將同時(shí)遍歷對(duì)象圖并標(biāo)記所有可訪問(wèn)對(duì)象。在此階段,load barrier測(cè)試所有裝載的引用,它將根據(jù)一個(gè)掩碼測(cè)試它們是否已經(jīng)被標(biāo)記,如果一個(gè)引用還沒(méi)有被標(biāo)記,那么它將被添加到一個(gè)隊(duì)列中以進(jìn)行標(biāo)記。

在遍歷完成之后,會(huì)有一個(gè)最后的,簡(jiǎn)短的,Stop The World階段,它處理一些邊緣情況(我們暫時(shí)忽略它),然后標(biāo)記完成。

Relocation

GC循環(huán)的下一個(gè)主要部分是重新定位。重定位包括移動(dòng)活動(dòng)對(duì)象,以便釋放堆的各個(gè)部分。為什么要移動(dòng)對(duì)象而不只是填補(bǔ)空白?一些GCs確實(shí)這樣做了,但它的不幸后果是,分配變得更加昂貴,因?yàn)楫?dāng)需要分配時(shí),分配程序需要找到放置對(duì)象的空閑空間。相反,如果可以釋放大量?jī)?nèi)存,那么分配就會(huì)簡(jiǎn)單地按照對(duì)象所需的內(nèi)存數(shù)量遞增(或“碰撞”)指針。

ZGC將堆劃分為頁(yè)面,在此階段的開(kāi)始,它會(huì)同時(shí)選擇一組頁(yè)面,這些頁(yè)面的活動(dòng)對(duì)象需要重新定位。當(dāng)選擇重定位集時(shí),有一個(gè)Stop(Stop The World),ZGC將重定位重定位集中作為根(局部變量等)引用的任何對(duì)象,并將其引用重新映射到新位置。與前面的Stop the World步驟一樣,這里所涉及的暫停時(shí)間僅取決于根的數(shù)量和重定位集的大小與活動(dòng)對(duì)象的總大小的比例,而這通常是相當(dāng)小的。它不像許多收集器那樣根據(jù)堆的整體大小進(jìn)行縮放。

在移動(dòng)任何必要的根之后,下一個(gè)階段是并發(fā)重新定位。在此階段,GC線程遍歷重定位集并重新定位它所包含的頁(yè)面中的所有對(duì)象。應(yīng)用程序線程也可以重新定位重定位集中的對(duì)象,如果它們?cè)噲D在GC重新定位對(duì)象之前加載它們,那么這可以通過(guò)負(fù)載屏障(從堆中加載引用時(shí)觸發(fā))實(shí)現(xiàn),詳見(jiàn)以下流程圖:

這可確保應(yīng)用程序看到的所有引用都已更新,并且應(yīng)用程序不可能對(duì)同時(shí)重定位的對(duì)象進(jìn)行操作。

GC線程最終將重定位重定位集中的所有對(duì)象,可能仍有引用指向這些對(duì)象的舊位置。GC可以遍歷對(duì)象圖并重新映射所有對(duì)其新位置的引用,但這是一個(gè)昂貴的步驟。相反,這與下一個(gè)標(biāo)記階段相結(jié)合。在步行期間,如果發(fā)現(xiàn)未重新映射引用,則將其重新映射,然后標(biāo)記為活動(dòng)。

Recap

試圖多帶帶理解復(fù)雜垃圾收集器(如ZGC)的性能特征是很困難的,但從前面的部分可以清楚地看出,我們所涵蓋的幾乎所有暫停都涉及依賴(lài)于GC根集合的工作,而不是實(shí)時(shí)的對(duì)象集,堆大小或垃圾。處理標(biāo)記終止的標(biāo)記階段的最后一次暫停是一個(gè)例外,但是是增量的,如果超過(guò)時(shí)間預(yù)算直到再次嘗試,GC將恢復(fù)為并發(fā)標(biāo)記。

性能

那它是如何表現(xiàn)的?Stefan Karlsson和Per Liden在今年早些時(shí)候的Jfokus演講中給出了一些初步數(shù)字。ZGC的SPECjbb 2015吞吐量數(shù)據(jù)與Parallel GC(優(yōu)化吞吐量)大致相當(dāng),但平均暫停時(shí)間為1ms,最長(zhǎng)為4ms。這與平均暫停時(shí)間超過(guò)200毫秒的G1和平行相反。

然而,垃圾收集器是復(fù)雜的野獸,基準(zhǔn)測(cè)試結(jié)果可能無(wú)法推廣到真實(shí)世界的性能。我們期待自己測(cè)試ZGC,以了解它的性能如何因工作量而異。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/73163.html

相關(guān)文章

  • 一文了解JVM全部垃圾回收器,從Serial到ZGC

    摘要:是目前的實(shí)驗(yàn)收集器。也是需要暫停程序一切的工作,然后多線程執(zhí)行垃圾回收。與最大的不同,它關(guān)注的是垃圾回收的吞吐量。這里的吞吐量指的是總時(shí)間與垃圾回收時(shí)間的比例。篩選回收,評(píng)估標(biāo)記垃圾,根據(jù)模式回收垃圾。 《對(duì)象搜索算法與回收算法》介紹了垃圾回收的基礎(chǔ)算法,相當(dāng)于垃圾回收的方法論。接下來(lái)就詳細(xì)看看垃圾回收的具體實(shí)現(xiàn)。 上文提到過(guò)現(xiàn)代的商用虛擬機(jī)的都是采用分代收集的,不同的區(qū)域用不同的收集...

    jasperyang 評(píng)論0 收藏0
  • Java11新特性

    摘要:從版本開(kāi)始,不再單獨(dú)發(fā)布或者版本了,有需要的可以自己通過(guò)去定制官方解讀官方細(xì)項(xiàng)解讀穩(wěn)步推進(jìn)系列六的小試牛刀一文讀懂的為何如此高效棄用引擎 Java語(yǔ)言特性系列 Java5的新特性 Java6的新特性 Java7的新特性 Java8的新特性 Java9的新特性 Java10的新特性 Java11的新特性 Java12的新特性 Java13的新特性 序 本文主要講述一下Java11的新...

    April 評(píng)論0 收藏0
  • JDK11新特性解讀

    摘要:千呼萬(wàn)喚,于正式發(fā)布版本即,也就是官方推薦可以廣泛使用的版本,其中發(fā)布了包括等個(gè)新特性,讓我們一睹為快。一新特性一覽二發(fā)布計(jì)劃日期階段說(shuō)明對(duì)進(jìn)入階段的變化會(huì)應(yīng)用越來(lái)越嚴(yán)格的審查。我們需要支持以保持競(jìng)爭(zhēng)力并與最新標(biāo)準(zhǔn)保持同步。 千呼萬(wàn)喚,JDK11于2018-09-25正式發(fā)布GA版本(GA即General Availability,也就是官方推薦可以廣泛使用的版本),其中發(fā)布了包括ZG...

    piglei 評(píng)論0 收藏0
  • 一篇文章了解新發(fā)布Java JDK 11

    摘要:到年將提供修復(fù)和安全更新。中期版本將每六個(gè)月發(fā)布一次。將擴(kuò)展類(lèi)文件格式以支持新的常量池形式。將提供一個(gè)低開(kāi)銷(xiāo)的數(shù)據(jù)收集框架,用于對(duì)應(yīng)用程序和進(jìn)行故障排除。項(xiàng)目負(fù)責(zé)人表示,維護(hù)成本和低使用率并不能證明其保留是合理的。將是第一個(gè)獲得支持的平臺(tái)。 Java JDK 11刪除了CORBA,Java EE和JavaFX支持,但添加了十幾個(gè)主要新功能。 Java Development Kit(J...

    Ethan815 評(píng)論0 收藏0
  • Java12新特性

    摘要:的這個(gè)特性新增了兩個(gè)參數(shù)分別是及,設(shè)置為的話,表示禁用。語(yǔ)法層面引入了版本的層面引入了,引入,讓支持,對(duì)等新增方法方面引入了版本的,不過(guò)的沒(méi)有另外主要對(duì)及進(jìn)行了改進(jìn)其中對(duì)支持了,默認(rèn)是開(kāi)啟,使用可以禁用對(duì)于則新增支持以及特性 Java語(yǔ)言特性系列 Java5的新特性 Java6的新特性 Java7的新特性 Java8的新特性 Java9的新特性 Java10的新特性 Java11的新...

    liujs 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<