JDK 8 到 JDK 23 的 ​语法糖(语言特性)​ 和 ​垃圾回收(GC)优化

JDK 8 到 JDK 23 的 语法糖(语言特性) 和 垃圾回收(GC)优化

语法糖(语言特性)演进

从 Lambda 表达式到模式匹配,Java 逐步引入更简洁的语法和现代编程范式。


JDK 8(2014)

  1. Lambda 表达式

    1. List list = Arrays.asList("a", "b", "c");
    2. list.forEach(s -> System.out.println(s));
  2. 方法引用

    1. list.forEach(System.out::println);
  3. Stream API

    1. list.stream().filter(s -> s.startsWith("a")).collect(Collectors.toList());
  4. 接口默认方法

    1. public interface MyInterface {
    2. default void log() {
    3. System.out.println("Default method");
    4. }
    5. }

JDK 9(2017)

  1. 模块系统(Project Jigsaw)

    1. module com.example.myapp {
    2. requires java.base;
    3. exports com.example.myapp.api;
    4. }
  2. 集合工厂方法

    1. List list = List.of("a", "b", "c");
    2. Set set = Set.of(1, 2, 3);
  3. 接口私有方法

    1. public interface MyInterface {
    2. private void logInternal() {
    3. System.out.println("Private method");
    4. }
    5. }

JDK 10(2018)

  1. 局部变量类型推断(var

    1. var list = new ArrayList();
    2. var name = "Java";

JDK 11(2018)

  1. 单文件源码直接运行

    1. java HelloWorld.java

JDK 12(2019)

  1. Switch 表达式(预览)

    1. int day = 3;
    2. String dayType = switch (day) {
    3. case 1, 2, 3 -> "Weekday";
    4. default -> "Weekend";
    5. };

JDK 13(2019)

  1. 文本块(预览)

    1. String json = """
    2. {
    3. "name": "Java",
    4. "version": 13
    5. }
    6. """;

JDK 14(2020)

  1. instanceof 模式匹配(预览)

    1. if (obj instanceof String s) {
    2. System.out.println(s.length());
    3. }
  2. Switch 表达式正式发布


JDK 15(2020)

  1. 密封类(预览)

    1. public sealed class Shape permits Circle, Rectangle {}

JDK 16(2021)

  1. instanceof 模式匹配正式发布

  2. 记录类(Record Classes)

    1. public record Point(int x, int y) {}

JDK 17(2021)

  1. 密封类正式发布

  2. 模式匹配 Switch(预览)

    1. Object obj = "Java";
    2. String result = switch (obj) {
    3. case Integer i -> "Integer: " + i;
    4. case String s -> "String: " + s;
    5. default -> "Unknown";
    6. };

JDK 18(2022)

  1. 简单 Web 服务器(jwebserver

    1. jwebserver -p 8080

JDK 19(2022)

  1. 虚拟线程(预览)

    1. try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
    2. executor.submit(() -> System.out.println("Virtual thread"));
    3. }

JDK 21(2023)

  1. 虚拟线程正式发布
  2. 模式匹配 Switch 正式发布

JDK 22(2024)

  1. 字符串模板(预览)

    1. String name = "Java";
    2. String message = STR."Hello \{name}!";

二、垃圾回收(GC)优化

JDK 8 的 GC 算法

默认 GC:Parallel GC

  • 特点
    • 多线程并行回收。
    • 吞吐量优先,适合计算密集型应用。
  • 分代模型
    • 年轻代(Young Generation):使用 Parallel Scavenge。
    • 老年代(Old Generation):使用 Parallel Old。

CMS(Concurrent Mark-Sweep)

  • 特点
    • 低停顿时间,适合延迟敏感应用。
    • 并发标记和清除,减少 Full GC 停顿。
  • 问题
    • 内存碎片化(需定期 Full GC 整理)。
    • 老年代回收效率较低。

G1 GC(Garbage-First)

  • 特点
    • 分区(Region)模型,支持大堆内存。
    • 低停顿时间,适合延迟敏感应用。
  • 问题
    • Full GC 仍为单线程,停顿时间长。

JDK 9 的 GC 改进

G1 GC 改进

  1. 并行 Full GC
    • 将 Full GC 改为多线程,减少停顿时间。
  2. 字符串去重
    • 自动检测并合并重复字符串,减少内存占用。

CMS 弃用警告

  • 提示 CMS 将在未来版本中被移除,建议迁移到 G1。

JDK 10 的 GC 改进

G1 Full GC 优化

  • 进一步优化并行 Full GC,减少停顿时间。

并行 Full GC 支持其他 GC

  • 为 Parallel GC 和 Serial GC 添加并行 Full GC 支持。

JDK 11 的 GC 改进

默认 GC 切换为 G1

  • G1 成为默认 GC,适合大多数应用场景。

ZGC(实验性)

  • 特点
    • 亚毫秒级停顿,适合超大堆内存(TB 级)。
    • 并发回收,无停顿时间。
  • 限制
    • 仅支持 Linux/x64。

JDK 12 的 GC 改进

Shenandoah GC(实验性)

  • 特点
    • 低停顿时间,适合延迟敏感应用。
    • 并发回收,与 ZGC 竞争。
  • 限制
    • 仅支持 Linux/x64。

G1 GC 改进

  1. 及时返回未使用内存
    • 在空闲时主动将内存归还给操作系统。
  2. 混合回收优化
    • 提高混合回收(Mixed GC)的效率。

JDK 13 的 GC 改进

ZGC 改进

  1. 最大堆内存扩展
    • 支持最大堆内存从 4TB 扩展到 16TB。
  2. macOS 支持
    • 扩展 ZGC 到 macOS 平台。

Shenandoah GC 改进

  1. Windows 支持
    • 扩展 Shenandoah 到 Windows 平台。

JDK 14 的 GC 改进

ZGC 改进

  1. Windows 支持
    • 扩展 ZGC 到 Windows 平台。

CMS 移除

  • 正式移除 CMS,建议迁移到 G1 或 ZGC。

JDK 15 的 GC 改进

ZGC 正式发布

  • ZGC 成为正式功能,推荐用于生产环境。

Shenandoah GC 正式发布

  • Shenandoah 成为正式功能,推荐用于生产环境。

JDK 16 的 GC 改进

弹性元空间(Metaspace)

  1. 动态调整元空间大小
    • 根据应用需求自动调整元空间内存占用。
  2. 减少内存碎片
    • 优化元空间内存分配,减少碎片化。

JDK 17 的 GC 改进

G1 改进

  1. 增量并行 Full GC
    • 将 Full GC 分为多个阶段,进一步减少停顿时间。

ZGC 改进

  1. macOS 和 Windows 支持优化
    • 提升 ZGC 在 macOS 和 Windows 上的性能。

JDK 21 的 GC 改进

分代 ZGC(预览)

  1. 分代模型
    • 将堆分为年轻代和老年代,优化回收效率。
  2. 低延迟
    • 进一步降低年轻代的回收延迟。

JDK 22 的 GC 改进

分代 ZGC 正式发布

  • 分代 ZGC 成为正式功能,推荐用于生产环境。

JDK 23 的 GC 改进(预计)

分代 ZGC 优化

  1. 年轻代回收效率提升
    • 进一步优化年轻代的回收算法。
  2. 堆内存扩展
    • 支持更大的堆内存(如 32TB)。

GC 算法对比

GC 算法 分代模型 特点 适用场景
Serial GC 分代 单线程,低开销 小型应用,单核环境
Parallel GC 分代 多线程,高吞吐量 计算密集型应用
CMS 分代 低停顿,并发回收 延迟敏感应用(已弃用)
G1 GC 分区(Region) 低停顿,适合大堆内存 通用场景
ZGC 无分代/分代 亚毫秒级停顿,超大堆内存支持 延迟敏感,大内存应用
Shenandoah 无分代 低停顿,并发回收 延迟敏感应用

升级建议

  1. 默认 GC
    • JDK 8 → JDK 11:从 Parallel GC 切换到 G1。
    • JDK 17+:优先使用 ZGC 或 Shenandoah。
  2. 延迟敏感应用
    • 启用 ZGC 或 Shenandoah,确保亚毫秒级停顿。
  3. 大内存应用
    • 使用 ZGC,支持 TB 级堆内存。

通过升级 JDK 并选择合适的 GC 算法,可以显著提升应用的性能和稳定性。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
JDKjvm

关于 JDK 不同版本对 指令集支持

2025-3-12 17:26:02

javaJDKjvm

线程和同步性能

2025-3-14 9:20:56

0 条回复 A文章作者 M管理员
欢迎您,新朋友,感谢参与互动!
    暂无讨论,说说你的看法吧