• 1、序列集合

    Java 21 中增加了一种新的集合类型:顺序集合(Sequenced Collections)。

    要介绍顺序集合,就首先要说明一下出现顺序(encounter order)。出现顺序指的是在遍历一个集合时,集合中元素的出现顺序。

    有些集合类型,有确定的出现顺序,比如 List。不管遍历多少次这样的集合,其中元素的出现顺序始终是固定。

    有些集合类型,并没有确定的出现顺序,比如 HashSet。如果多次遍历这样的集合,其中元素的出现顺序是不固定的。

    在顺序集合出现之前,Java 并没有一个统一的接口来描述具有确定出现顺序的集合。比如 Set 接口虽然没有确定的出现顺序,但是它的子类型 LinkedHashSet 和 SortedSet 是有的。

    另外一个问题是,对于有固定出现顺序的集合,并没有定义统一的与顺序相关的操作。与顺序集合的处理相关的方法,散落在 Java 集合类库的不同地方。这些方法并没有统一的声明,使用起来也不方便。

    与顺序集合相关的操作包括:

    • 获取集合的第一个和最后一个元素

    • 在集合的最前面和最后面插入或删除元素

    • 按照逆序来遍历集合

    Java 21 的顺序集合会解决这些问题。增加了 3 个新的接口。

    首先是SequencedCollection,该接口的声明如下所示:

    image.png

    SequencedCollection 继承自 Collection

    在包含的方法中:

    • reversed 方法返回一个逆序的 SequencedCollection 对象。

    • addFirst 和 addLast 方法分别在集合的起始和结束位置添加新的元素。

    • getFirst 和 getLast 方法分别获取集合的第一个和最后一个元素。

    • removeFirst 和 removeLast 方法分别删除集合的第一个和最后一个元素。

    除了SequencedCollection 之外,还有几个具体的子类型:

    SequencedSet 同时继承自 Set 和 SequencedCollection

    {0E5C909B-8F10-4FAF-8ED6-A31A2E13F701}.png

    SequencedMap 继承自 Map,其中的 entry 有确定的出现顺序。

    SequencedMap 中的方法比较多,如下所示:

    {E70F0C25-249C-4F71-890A-5FAC695233C6}.png

    具体的方法说明:

    • reversed 方法返回一个 entry 逆序的 SequencedMap。

    • sequencedKeySet 方法返回包含 key 的 SequencedSet。

    • sequencedValues 方法返回包含 value 的 SequencedCollection。

    • sequencedEntrySet 方法返回包含 entry 的 SequencedSet。

    • putFirst 和 putLast 分别在 entry 的最前和最后位置插入名值对。

    • firstEntry 和 lastEntry 分别获取第一个和最后一个 entry。

    • pollFirstEntry 和 pollLastEntry 分别删除第一个和最后一个 entry。

    添加了这3个新的接口之后,Java 集合类的层次结构发生了变化,如下图所示:

    {B233A636-8AE7-44B4-9639-C2AF22B638EA}.png

    绿色方框是新增的 3 个接口,从中可以看到已有集合类的继承关系的变化:

    • List 继承自 SequencedCollection。

    • Deque 继承自 SequencedCollection。

    • LinkedHashSet 实现了 SequencedSet 接口。

    • SortedSet 继承自 SequencedSet。

    • LinkedHashMap 实现了 SequencedMap 接口。

    • SortedMap 继承自 SequencedMap。

    有了这3个新的顺序集合相关的接口之后,Java 代码可以更清楚地表达顺序集合以及顺序集合上的操作。



  • 2、分代 ZGC

    分代 ZGC(Generational ZGC)在 hotspot/gc 包中。

    通过扩展Z垃圾回收器(ZGC)来维护年轻对象和年老对象的独立生成,从而提高应用程序性能。这将使ZGC能够更频繁地收集年轻对象——这些对象往往英年早逝。

    1. 什么是Generational ZGC?

    Generational ZGC(Z Garbage Collector)是一种用于Java虚拟机(JVM)的垃圾回收器。它是OpenJDK项目中的一个特性,旨在提供低延迟和高吞吐量的垃圾回收解决方案。

    2. 为什么需要Generational ZGC?

    传统的垃圾回收器在处理大型堆内存时可能会导致长时间的停顿,这对于需要快速响应和低延迟的应用程序来说是不可接受的。Generational ZGC的目标是减少这些停顿时间,并且能够处理非常大的堆内存。

    3. Generational ZGC的实现原理

    Generational ZGC基于分代垃圾回收的概念,将堆内存划分为多个代。其中包括Young Generation(年轻代)和Old Generation(老年代)。具体的实现原理如下:

    年轻代(Young Generation)

    • 年轻代使用了Region的概念,将整个年轻代划分为多个大小相等的区域。

    • 每个区域都有一个指针指向下一个可用的区域,形成一个链表结构。

    • 当对象被创建时,它们首先被分配到年轻代的某个区域中。

    • 当一个区域被填满时,会触发一次年轻代垃圾回收(Minor GC)。

    • Minor GC使用了并行和压缩算法来回收不再使用的对象。

    老年代(Old Generation)

    • 老年代是存放生命周期较长的对象的区域。

    • 当一个对象在年轻代经历了多次垃圾回收后仍然存活,它将被晋升到老年代。

    • 当老年代空间不足时,会触发一次老年代垃圾回收(Major GC)。

    • Major GC使用了并发标记和并行清理算法来回收不再使用的对象。

    并发处理

    Generational ZGC采用了并发处理的方式来减少停顿时间。具体包括:

    • 年轻代垃圾回收过程中,应用程序可以继续执行。

    • 在老年代垃圾回收过程中,应用程序也可以继续执行,只有在最后的清理阶段才会产生短暂的停顿。

    4. Generational ZGC的优点

    • 低延迟:Generational ZGC通过并发处理和分代回收的策略,实现了非常低的停顿时间,适合对响应时间要求高的应用场景。

    • 高吞吐量:Generational ZGC在尽可能减少停顿时间的同时,也能保持较高的垃圾回收吞吐量。

    • 大堆支持:Generational ZGC可以处理非常大的堆内存,适用于需要大内存容量的应用程序。

    5. Generational ZGC的缺点

    • 性能开销:由于并发处理和分代回收的策略,Generational ZGC会带来一定的性能开销。这主要体现在CPU和内存的使用上。

    • 配置复杂:Generational ZGC有一些与性能相关的配置参数,需要根据具体场景进行调整,对于不熟悉的用户来说可能比较复杂。

    6. Generational ZGC的使用示例

    以下是一个简单的Java代码示例,展示了如何启用Generational ZGC:

    {F941622D-2990-4965-A8C0-71410B9E6CB0}.png

    7. Generational ZGC的使用注意事项

    • Generational ZGC是OpenJDK项目中的新特性,虽然已经相当稳定,但仍然建议在生产环境中进行充分测试。

    • 在使用Generational ZGC时,建议监控系统资源使用情况,以便及时调整配置参数或采取其他措施来优化性能。

    8. 总结

    Generational ZGC是一种用于Java虚拟机的垃圾回收器,旨在提供低延迟和高吞吐量的垃圾回收解决方案。它通过并发处理和分代回收的策略,实现了非常低的停顿时间,并且能够处理非常大的堆内存。然而,使用Generational ZGC需要注意性能开销和配置复杂性。



  • 3、记录模式


    使用记录模式(Record Patterns)增强Java编程语言,以解构记录值。可以嵌套记录模式和类型模式,以实现功能强大、声明性和可组合形式的数据导航和处理。

    Record Patterns

    该功能首次在 Java SE 19 中预览,在Java SE 20中发布第二次预览版,在此版本中成为永久性功能。这意味着它可以在任何为 Java SE 21 编译的程序中使用,而无需启用预览功能。

    示例代码如下

    {B17FBAFC-E085-418C-A021-56C14AC405C3}.png