摘要:在本文中,我們將介紹新的動機,技術概述以及開啟的一些非常令人興奮的可能性。虛擬內存是抽象,意味著應用程序有自己的通常是隔離的視圖到物理內存。多映射涉及將不同范圍的虛擬內存映射到同一物理內存。根中可訪問的對象集稱為活動集。
Java 11最近已發布,包含一些非常棒的功能。該版本包含一個全新的垃圾收集器ZGC,它由Oracle開發,承諾在數TB的堆上具有非常低的暫停時間。在本文中,我們將介紹新GC的動機,技術概述以及ZGC開啟的一些非常令人興奮的可能性。
那么為什么需要新的GC呢?Java 10已經搭載了四艘經過多年實戰測試且幾乎可以無限調優。為了正確看待這一點,G1最新的Hotspot GC是在2006年推出的。當時最大的AWS實例是最初的m1.small包裝1 vCPU和1.7GB內存,今天AWS很樂意租給你一個x1e.32x大型,128個vCPU,令人難以置信的3,904GB內存的服務器。ZGC的設計針對這些容量普遍存在的未來:多TB容量,暫停時間低(<10ms),對整體應用性能有影響(吞吐量 GC術語
為了理解ZGC在哪里適合現有的收集器,以及它如何能夠做到這一點,我們首先需要回顧一些術語。垃圾收集最基本的工作是確定不再使用的內存,并使其可以重用?,F代收藏家是分幾個階段進行這一過程的,他們往往被描述為:
并行 - 在JVM運行時,有應用程序線程和垃圾收集器線程。并行階段是由多個gc線程執行的階段,即工作在它們之間分開。它沒有說明gc線程是否可能與正在運行的應用程序線程重疊。
串行 - 串行的階段僅在單個gc線程上執行。與上面的并行一樣,它沒有說明工作是否與當前運行的應用程序線程重疊。
Stop The World - Stop The World階段,應用程序線程被暫停,以便gc執行其工作。當您遇到GC暫停時,這是由于Stop The World階段。
并發 - 如果一個階段是并發的,那么GC可以在應用程序線程正在進行其工作的同時執行其工作。并發階段很復雜,因為它們需要能夠處理應用程序線程,從而可能在階段完成之前使其工作無效。
增量 - 如果一個階段是增量的,那么它可以運行一段時間并由于某些條件而提前終止,例如時間預算或需要執行的更高優先級的gc階段,同時仍然完成了生產性工作。這與需要完全完成的階段形成鮮明對比。
固有的權衡取舍
值得指出的是,所有這些屬性都需要權衡利弊。例如,并行階段將利用多個gc線程來執行工作,但這樣做會導致線程之間協調的開銷。同樣,并發階段不會暫停應用程序線程,但可能涉及更多的開銷和復雜性,以處理應用程序線程同時使其工作無效。
ZGC
現在我們了解不同gc階段的屬性,讓我們探討ZGC的工作原理。為了實現其目標,ZGC使用了Hotspot Garbage Collectors的兩種新技術:彩色指針和負載障礙。
指針著色
指針著色是一種將信息存儲在指針(或Java術語,引用)本身中的技術。這是可能的,因為在64位平臺上(ZGC僅為64位),指針可以處理比系統實際擁有的內存更多的內存,因此可以使用其他一些位來存儲狀態。ZGC將自己限制在需要42位的4Tb堆中,只留下22位可能的狀態,目前它使用4位:finalizable、remap、mark0和mark1。我們稍后會解釋它們的用途。
指針著色的一個問題是,當您需要取消引用指針時,它可以創建額外的工作,因為您需要屏蔽掉信息位。像SPARC這樣的平臺有內置硬件支持指針屏蔽所以它不是問題,但對于x86,ZGC團隊使用了一個簡潔的多映射技巧。
多重映射
要了解多映射的工作原理,我們需要簡要解釋虛擬和物理內存之間的區別。物理內存是系統可用的實際內存,通常是安裝的DRAM芯片的容量。虛擬內存是抽象,意味著應用程序有自己的(通常是隔離的)視圖到物理內存。操作系統負責維護虛擬內存和物理內存范圍之間的映射,它通過使用頁表和處理器的內存管理單元(MMU)和轉換后備緩沖區(TLB)來實現這一點,后者轉換應用程序請求的地址。
多映射涉及將不同范圍的虛擬內存映射到同一物理內存。由于設計只有一個重映射,mark0和MARK-1可以在任何時間點為1,這是可能的三個映射做到這一點。ZGC源代碼中有一個很好的圖表。
負載障礙
負載障礙是每當應用程序線程從堆加載引用時運行的代碼片段(即訪問對象上的非原始字段):
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 }
在上面的代碼中,分配名稱的行包括跟隨對堆上對象數據的person引用,然后將引用加載到它包含的名稱。此時觸發負載屏障。觸發打印到屏幕的第二行不會直接導致加載障礙觸發,因為沒有來自堆的引用加載 - 名稱是局部變量,因此沒有從堆加載引用。但是,引用System和out,或者println內部可能會觸發其他負載障礙。這與其他GC使用的寫屏障形成對比,例如G1。加載屏障的工作是檢查引用的狀態,并在將引用(或者甚至是不同的引用)返回給應用程序之前執行一些工作。在ZGC中,它通過測試加載的引用來執行此任務,以查看是否設置了某些位,具體取決于當前階段。如果引用通過測試,則不執行任何其他工作,如果失敗,則在將引用返回給應用程序之前執行某些特定于階段的任務。
Marking
現在我們了解了這兩種技術是什么,讓我們看看ZGC GC循環。循環的第一部分是標記。標記涉及到以某種方式查找和標記所有堆對象,這些對象可以被正在運行的應用程序訪問,換句話說,查找不是垃圾的對象。
ZGC的標記分為三個階段。第一個階段是Stop The World階段,在這個階段中,GC的根被標記為存在。GC根類似于局部變量,應用程序可以使用它訪問堆上的其他對象。如果對象不能通過從根開始的對象圖遍歷來訪問,那么應用程序就無法訪問它,它被認為是垃圾。根中可訪問的對象集稱為活動集。GC根標記步驟非常短,因為根的總數通常相對較小。
一旦該階段完成,應用程序將繼續,ZGC將開始下一個階段,該階段將同時遍歷對象圖并標記所有可訪問對象。在此階段,load barrier測試所有裝載的引用,它將根據一個掩碼測試它們是否已經被標記,如果一個引用還沒有被標記,那么它將被添加到一個隊列中以進行標記。
在遍歷完成之后,會有一個最后的,簡短的,Stop The World階段,它處理一些邊緣情況(我們暫時忽略它),然后標記完成。
Relocation
GC循環的下一個主要部分是重新定位。重定位包括移動活動對象,以便釋放堆的各個部分。為什么要移動對象而不只是填補空白?一些GCs確實這樣做了,但它的不幸后果是,分配變得更加昂貴,因為當需要分配時,分配程序需要找到放置對象的空閑空間。相反,如果可以釋放大量內存,那么分配就會簡單地按照對象所需的內存數量遞增(或“碰撞”)指針。
ZGC將堆劃分為頁面,在此階段的開始,它會同時選擇一組頁面,這些頁面的活動對象需要重新定位。當選擇重定位集時,有一個Stop(Stop The World),ZGC將重定位重定位集中作為根(局部變量等)引用的任何對象,并將其引用重新映射到新位置。與前面的Stop the World步驟一樣,這里所涉及的暫停時間僅取決于根的數量和重定位集的大小與活動對象的總大小的比例,而這通常是相當小的。它不像許多收集器那樣根據堆的整體大小進行縮放。
在移動任何必要的根之后,下一個階段是并發重新定位。在此階段,GC線程遍歷重定位集并重新定位它所包含的頁面中的所有對象。應用程序線程也可以重新定位重定位集中的對象,如果它們試圖在GC重新定位對象之前加載它們,那么這可以通過負載屏障(從堆中加載引用時觸發)實現,詳見以下流程圖:
這可確保應用程序看到的所有引用都已更新,并且應用程序不可能對同時重定位的對象進行操作。
GC線程最終將重定位重定位集中的所有對象,可能仍有引用指向這些對象的舊位置。GC可以遍歷對象圖并重新映射所有對其新位置的引用,但這是一個昂貴的步驟。相反,這與下一個標記階段相結合。在步行期間,如果發現未重新映射引用,則將其重新映射,然后標記為活動。
Recap
試圖多帶帶理解復雜垃圾收集器(如ZGC)的性能特征是很困難的,但從前面的部分可以清楚地看出,我們所涵蓋的幾乎所有暫停都涉及依賴于GC根集合的工作,而不是實時的對象集,堆大小或垃圾。處理標記終止的標記階段的最后一次暫停是一個例外,但是是增量的,如果超過時間預算直到再次嘗試,GC將恢復為并發標記。
性能
那它是如何表現的?Stefan Karlsson和Per Liden在今年早些時候的Jfokus演講中給出了一些初步數字。ZGC的SPECjbb 2015吞吐量數據與Parallel GC(優化吞吐量)大致相當,但平均暫停時間為1ms,最長為4ms。這與平均暫停時間超過200毫秒的G1和平行相反。
然而,垃圾收集器是復雜的野獸,基準測試結果可能無法推廣到真實世界的性能。我們期待自己測試ZGC,以了解它的性能如何因工作量而異。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/73163.html
摘要:是目前的實驗收集器。也是需要暫停程序一切的工作,然后多線程執行垃圾回收。與最大的不同,它關注的是垃圾回收的吞吐量。這里的吞吐量指的是總時間與垃圾回收時間的比例。篩選回收,評估標記垃圾,根據模式回收垃圾。 《對象搜索算法與回收算法》介紹了垃圾回收的基礎算法,相當于垃圾回收的方法論。接下來就詳細看看垃圾回收的具體實現。 上文提到過現代的商用虛擬機的都是采用分代收集的,不同的區域用不同的收集...
摘要:從版本開始,不再單獨發布或者版本了,有需要的可以自己通過去定制官方解讀官方細項解讀穩步推進系列六的小試牛刀一文讀懂的為何如此高效棄用引擎 Java語言特性系列 Java5的新特性 Java6的新特性 Java7的新特性 Java8的新特性 Java9的新特性 Java10的新特性 Java11的新特性 Java12的新特性 Java13的新特性 序 本文主要講述一下Java11的新...
摘要:千呼萬喚,于正式發布版本即,也就是官方推薦可以廣泛使用的版本,其中發布了包括等個新特性,讓我們一睹為快。一新特性一覽二發布計劃日期階段說明對進入階段的變化會應用越來越嚴格的審查。我們需要支持以保持競爭力并與最新標準保持同步。 千呼萬喚,JDK11于2018-09-25正式發布GA版本(GA即General Availability,也就是官方推薦可以廣泛使用的版本),其中發布了包括ZG...
摘要:到年將提供修復和安全更新。中期版本將每六個月發布一次。將擴展類文件格式以支持新的常量池形式。將提供一個低開銷的數據收集框架,用于對應用程序和進行故障排除。項目負責人表示,維護成本和低使用率并不能證明其保留是合理的。將是第一個獲得支持的平臺。 Java JDK 11刪除了CORBA,Java EE和JavaFX支持,但添加了十幾個主要新功能。 Java Development Kit(J...
摘要:的這個特性新增了兩個參數分別是及,設置為的話,表示禁用。語法層面引入了版本的層面引入了,引入,讓支持,對等新增方法方面引入了版本的,不過的沒有另外主要對及進行了改進其中對支持了,默認是開啟,使用可以禁用對于則新增支持以及特性 Java語言特性系列 Java5的新特性 Java6的新特性 Java7的新特性 Java8的新特性 Java9的新特性 Java10的新特性 Java11的新...
閱讀 878·2021-10-13 09:39
閱讀 3531·2021-09-26 10:16
閱讀 2861·2019-08-30 15:54
閱讀 1037·2019-08-30 14:22
閱讀 2886·2019-08-29 15:39
閱讀 3253·2019-08-27 10:52
閱讀 809·2019-08-26 13:59
閱讀 1703·2019-08-26 12:20