从Java8到Java23值得期待的x个特性

你好,我是看山。

本文收录在 《从小工到专家的 Java 进阶之旅》 系列专栏中。

概述

从 2017 年开始,Java 版本更新遵循每六个月发布一次的节奏,LTS版本则每两年发布一次,以快速验证新特性,推动 Java 的发展。

Java版本分布

数据来源2024 State of the Java Ecosystem

垃圾收集器

G1(Java 9)

G1垃圾收集器(Garbage-First Garbage Collector,简称G1 GC)是一种专为服务器端应用设计的垃圾收集器,特别适用于具有多核处理器和大内存的机器。它在Java 9中成为默认的垃圾收集器。

  1. 分区机制:G1将整个堆空间划分为若干个大小相等的独立区域(Region),每个Region的大小根据堆的实际大小而定,通常控制在1MB到32MB之间。这种分区的思想弱化了传统的分代概念,使得垃圾收集更加灵活和高效。
  2. 垃圾回收策略:G1采用混合垃圾回收策略(Mix GC),不仅回收新生代中的所有Region,还会回收部分老年代中的Region。这种策略的目标是在保证停顿时间不超过预期的情况下,尽可能地回收更多的垃圾对象。
  3. 并行与并发:G1能够充分利用CPU、多核环境下的硬件优势,使用多个CPU核心来缩短Stop-The-World停顿时间。部分其他收集器需要停顿Java线程执行的GC动作,但G1可以通过并发的方式让Java程序继续运行。
  4. 高吞吐量与低延迟:G1的主要目标是在满足高吞吐量的同时,尽可能减少GC停顿时间。通过跟踪各个Region中的垃圾堆积情况,每次根据设置的垃圾回收时间,优先处理优先级最高的区域,避免一次性清理整个新生代或整个老年代的垃圾。

G1垃圾收集器非常适合大尺寸堆内存的应用场景,特别是在多处理器环境下。它的设计目标是能够在有限的时间内获取尽可能高的收集效率,并且避免内存碎片。对于那些对GC停顿时间敏感的应用,如实时系统和大数据处理系统,G1是一个非常合适的选择。

ZGC(Java 15)

ZGC 是一个可伸缩、低延迟的垃圾收集器,使用-XX:+UseZGC 命令开启。

名称中的“Z”并没有特定的含义,主要是一个名称,灵感来源于Oracle的ZFS文件系统。ZFS在设计上具有革命性,因此ZGC的命名也向其致敬。

在Java15发布时,提供的是不分代收集器,所有对象都放在一起,期望STW最大10ms。

在Java21的时候,基于「大部分对象朝生夕死」的分代假说,ZGC提供了分代版本,将内存划分为年轻代和老年代,并为这两种代分别维护不同的垃圾收集策略,期望STW最大是1ms。

我们看下Hazelcast Jet on Generational ZGC中给出的测评效果:

JEP 439: 分代ZGC(Generational ZGC)

从上图可以看到,非分代 ZGC 在低负载下表现非常好,但随着分配压力的增加,延迟也会增加。使用分代 ZGC 后,即使在高负载下,延迟也非常低,而且延迟效果优于G1。

Shenandoah(Java 15)

Shenandoah(读音:谢南多厄),作为一个低停顿的垃圾收集器。

Shenandoah 垃圾收集器是 RedHat 在 2014 年宣布进行的垃圾收集器研究项目,其工作原理是通过与 Java 应用执行线程同时运行来降低停顿时间。

简单的说就是,Shenandoah 工作时与应用程序线程并发,通过交换 CPU 并发周期和空间以改善停顿时间,使得垃圾回收器执行线程能够在 Java 线程运行时进行堆压缩,并且标记和整理能够同时进行,因此避免了在大多数 JVM 垃圾收集器中所遇到的问题。

Shenandoah GC

Shenandoah 垃圾回收器的暂停时间与堆大小无关,这意味着无论将堆设置为 200MB 还是 200GB,都将拥有一致的系统暂停时间,不过实际使用性能将取决于实际工作堆的大小和工作负载。

https://wiki.openjdk.java.net/display/shenandoah

文末总结

想要了解各版本的详细特性,可以从从小工到专家的 Java 进阶之旅 系列专栏中查看。

青山不改,绿水长流,我们下次见。

推荐阅读


你好,我是看山。游于码界,戏享人生。如果文章对您有帮助,请点赞、收藏、关注。我还整理了一些精品学习资料,关注公众号「看山的小屋」,回复“资料”即可获得。

👇🏻欢迎关注我的公众号「看山的小屋」,领取精选资料👇🏻

公众号:看山的小屋