Java 18 如何改進處理大型物件回收的記憶體碎片問題? -

banq發表於2021-11-21

由於記憶體集資料結構的限制,Java 的G1堆區域的大小一直限制在 32MB;使用 JDK 18 版本JDK-8275056將把這個限制提高到 512MB。
在垃圾收集期間,G1會從一堆死物件中選擇它認為包含大量空白空間的任意區域,並將它們的活動物件移動並壓縮到另一個(更小)區域集。不同之處在於 G1 在此集合中釋放了哪些內容以供進一步應用程式使用。
通常情況下,物件不能跨越區域:典型的 Java 物件範圍在幾十個位元組,因此可用區域大小的範圍(從 1MB 到 32MB)通常不是問題。
如果您的應用程式使用大量大物件,那麼這種巨大物件分配的實現選擇可能會導致碎片問題。
 JDK 18 版本JDK-8275056是如何克服堆區域大小限制的呢?新的記憶體集實現不再需要 Java 堆區域和記憶體集的 1:1 對映。而是1:n 對映:單個堆區域現在可能被多個卡片區域覆蓋。由此,解鎖了高達 512MB 的可配置堆區域大小(這是一個任意限制),即使使用最大的龐大物件和 Java 堆,也應具有足夠的靈活性以避擴音到的碎片問題。
詳細點選標題

相關文章