自 JDK 8 以來,Java 的垃圾收集 (GC) 經歷了重大演變,解決了延遲、暫停時間和記憶體開銷等常見挑戰。本文探討了這些進步,重點在於對開發人員從 JDK 8 等舊版本過渡到 JDK 17 和 JDK 21 等現代替代版本的實際影響。無論您是維護舊版應用程式還是規劃未來的遷移,了解這些更新都至關重要。
Java 中的垃圾收集 (GC) 可自動化記憶體管理,使開發人員無需處理低階細節。 GC 的兩個主要目標是:
這種劃分基於分代假設,該假設假設大多數物件都會在年輕時死亡,從而使年輕代收集比完整堆收集更有效。 Java 提供了多種 GC 演算法,每種演算法都針對特定用例量身定制:
Garbage Collector | Focus | Use Case | Pause Time | Throughput |
---|---|---|---|---|
Serial GC | Low memory overhead | Small containers | Medium | Low |
Parallel GC | High throughput | Batch processing or large datasets | High | High |
G1 GC | Balanced performance | General-purpose, low-latency workloads | Medium-Low | Medium-High |
ZGC | Ultra-low latency | Large-scale applications, low latency | Sub-millisecond | Medium |
Shenandoah GC | Low latency | Large heaps, near-real-time processing | Very low | Medium |
G1 GC 作為 JDK 9 中的預設收集器引入,使用基於區域的堆佈局並支援並發標記。這使得它可以在不停止應用程式執行緒的情況下確定活動性。透過將年輕代和老一代集合合併成更小的混合集合,G1 減少了暫停時間並提高了整體反應能力。
ZGC 專為超低延遲而設計,可以處理 TB 大小的堆,暫停時間在亞毫秒範圍內。它與應用程式線程同時執行大部分工作,非常適合需要一致響應能力的應用程序,例如雲端服務或金融系統。
ZGC 分代模式(在 JDK 21 中引入)透過應用分代假設來分離短壽命和長壽命對象,進一步提高吞吐量。
SPECjbb 2015 等基準測試表明,自 JDK 8 以來,現代 GC 演算法在吞吐量和延遲方面都有顯著改進:
所有收集器的暫停時間都已大幅減少:
由於記憶集和用於基於區域的集合的資料結構的最佳化,G1 GC 顯著減少了本機記憶體開銷。從 JDK 8 到 JDK 17,G1 的本機記憶體使用量幾乎減少了一半。為了更好地說明 GC 的實際應用,請考慮以下範例:
# Add these options to your JVM startup command java -XX:+UseG1GC -XX:MaxGCPauseMillis=50 -Xmx2g -Xms2g -jar app.jar
此配置:
java -XX:+UseZGC -Xms4g -Xmx4g -XX:SoftRefLRUPolicyMSPerMB=50 -jar app.jar
此設定:
雖然從 JDK 8 升級到更新版本(例如 JDK 17 或 21)可以帶來顯著的好處,但開發人員必須考慮:
自 JDK 8 以來,Java 垃圾回收的進步非常顯著。隨著吞吐量、延遲和記憶體開銷的顯著改進,任何 Java 應用程式都需要升級到較新的 JDK 版本。
無論您執行小型容器或大型雲端服務,都有針對您的用例進行最佳化的 GC 演算法。因此,如果您仍在使用 JDK 8,那麼是時候實現飛躍並享受現代 Java 的效能優勢了。
有關更多信息,請觀看 Devoxx 比利時的有關 Java 中的垃圾收集的視頻:Stefan Johansson 自 JDK 8 以來的進展
?
以上是Java 中的垃圾回收:自 JDK 8 以來的進展的詳細內容。更多資訊請關注PHP中文網其他相關文章!