JDK 18修復了三個重要功能 - malloc

banq發表於2022-05-15

現在讓我們談談 JDK 18 中的新功能(從 ZGC 的角度來看)。

字串重複資料刪除
字串重複資料刪除是一個 JVM 特性 ( -XX:+UseStringDeduplication),它已經存在了很長一段時間。它透過自動刪除支援 String 物件的相同字元陣列來幫助減少 Java 堆記憶體使用。例如,如果堆上存在兩個 String 物件,並且它們都指向一個包含字元“Java”的後備陣列,那麼其中一個 String 物件將被修改,以便兩個 String 物件指向同一個陣列,而另一個陣列將變得無法訪問並受到垃圾收集。這可以幫助一些應用程式減少相當多的堆記憶體使用量,因為 String 物件可以佔用 Java 堆的重要部分,並且在這些物件中查詢重複項是相當普遍的。

類的解除安裝問題得到修正
我們在ZGC郵件列表中收到一份關於效能問題的報告。結果發現這是一個10年前的錯誤,可以追溯到PermGen的刪除。

因此,大約10年前,移除PermGen的補丁對一個處理Inline Cache清理的函式做了一些修改。Inline Cache是一種投機性的最佳化技術,由JVM用來加快Java中的方法呼叫速度。當GC解除安裝未使用的類和編譯的方法時,一些Inline Cache需要被清理,以便它們不再引用任何未載入的實體。

事實證明,這個補丁包含了一個小而重要的編輯錯誤,即縮排和作用域被混淆了。光看補丁很難發現這個錯誤,因為有問題的程式碼也被移動了。這個錯誤導致了一些內聯快取被錯誤地清理了。然而,這種不正確的清理並沒有導致任何明顯的問題,比如JVM崩潰。相反,它引起了一個惡性迴圈,GC和Java執行緒在如何清理這些快取方面存在分歧,併為之爭吵。最終的結果是,在某些情況下,類的解除安裝可能需要很長的時間才能完成。由於這個問題的根本原因是GC和併發執行的Java執行緒之間的不良互動,所以它隻影響到做併發類解除安裝的GC(如ZGC)。做 "停止世界 "類解除安裝的GC(如SerialGC、ParallelGC和G1GC)不受影響,因為這種不良的互動永遠不會出現,因為Java執行緒從來不與GC同時執行。

幸運的是,一旦這個問題被發現,修復工作就很簡單了。如果你對更多的細節感興趣,你可以在相應的拉動請求中閱讀所有關於它的內容。

Linux/PowerPC支援
早在2013年,也就是在ZGC出現之前,JEP 175就已經建立了,以便為OpenJDK帶來Linux/PowerPC(以及AIX/PowerPC)支援。最初的移植是作為JDK 8u20的一部分發貨的,並一直保持到現在。支援這一平臺的努力從一開始就得到了我們在SAP的朋友的資助。

因此,當聽到也是SAP提供了使ZGC在Linux/PowerPC上可用的補丁時,可能不會感到驚訝。增加對新的CPU架構的支援,主要是在直譯器和兩個JIT編譯器中實現ZGC的各種障礙(負載障礙、nmethod進入障礙和堆疊水印障礙)。該補丁大約有1200行程式碼。

從JDK 18開始,ZGC現在可以在以下平臺上執行(更多細節見此表)。

  • Linux/x64
  • Linux/AArch64
  • Linux/PowerPC
  • macOS/x64
  • macOS/AArch64
  • Windows/x64
  • Windows/AArch64


總結

  • 現在支援JVM選項-XX:+UseStringDeduplication。這個功能(預設情況下是禁用的)告訴ZGC尋找並重複利用相同的字元陣列來支援String物件,以減少整體堆記憶體的使用。
  • 修正了一個10年前的錯誤,該錯誤有時會導致類的解除安裝時間非常長。
  • ZGC現在可以在Linux/PowerPC上執行,這要感謝SAP的人。


 

相關文章