JDK 8 到 JDK 23 的 语法糖(语言特性) 和 垃圾回收(GC)优化
语法糖(语言特性)演进
从 Lambda 表达式到模式匹配,Java 逐步引入更简洁的语法和现代编程范式。
JDK 8(2014)
-
Lambda 表达式:
List
list = Arrays.asList("a", "b", "c"); list.forEach(s -> System.out.println(s));
-
方法引用:
list.forEach(System.out::println);
-
Stream API:
list.stream().filter(s -> s.startsWith("a")).collect(Collectors.toList());
-
接口默认方法:
public interface MyInterface {
default void log() {
System.out.println("Default method");
}
}
JDK 9(2017)
-
模块系统(Project Jigsaw):
module com.example.myapp {
requires java.base;
exports com.example.myapp.api;
}
-
集合工厂方法:
List
list = List.of("a", "b", "c"); Set set = Set.of(1, 2, 3);
-
接口私有方法:
public interface MyInterface {
private void logInternal() {
System.out.println("Private method");
}
}
JDK 10(2018)
-
局部变量类型推断(
var
)var list = new ArrayList
(); var name = "Java";
JDK 11(2018)
-
单文件源码直接运行
java HelloWorld.java
JDK 12(2019)
-
Switch 表达式(预览)
int day = 3;
String dayType = switch (day) {
case 1, 2, 3 -> "Weekday";
default -> "Weekend";
};
JDK 13(2019)
-
文本块(预览)
String json = """
{
"name": "Java",
"version": 13
}
""";
JDK 14(2020)
-
instanceof
模式匹配(预览):if (obj instanceof String s) {
System.out.println(s.length());
}
-
Switch 表达式正式发布。
JDK 15(2020)
-
密封类(预览)
public sealed class Shape permits Circle, Rectangle {}
JDK 16(2021)
-
instanceof
模式匹配正式发布。 -
记录类(Record Classes)
public record Point(int x, int y) {}
JDK 17(2021)
-
密封类正式发布。
-
模式匹配 Switch(预览)
Object obj = "Java";
String result = switch (obj) {
case Integer i -> "Integer: " + i;
case String s -> "String: " + s;
default -> "Unknown";
};
JDK 18(2022)
-
简单 Web 服务器(
jwebserver
)jwebserver -p 8080
JDK 19(2022)
-
虚拟线程(预览)
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
executor.submit(() -> System.out.println("Virtual thread"));
}
JDK 21(2023)
- 虚拟线程正式发布。
- 模式匹配 Switch 正式发布。
JDK 22(2024)
-
字符串模板(预览)
String name = "Java";
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 改进
- 并行 Full GC
- 将 Full GC 改为多线程,减少停顿时间。
- 字符串去重
- 自动检测并合并重复字符串,减少内存占用。
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 改进
- 及时返回未使用内存
- 在空闲时主动将内存归还给操作系统。
- 混合回收优化
- 提高混合回收(Mixed GC)的效率。
JDK 13 的 GC 改进
ZGC 改进
- 最大堆内存扩展
- 支持最大堆内存从 4TB 扩展到 16TB。
- macOS 支持
- 扩展 ZGC 到 macOS 平台。
Shenandoah GC 改进
- Windows 支持
- 扩展 Shenandoah 到 Windows 平台。
JDK 14 的 GC 改进
ZGC 改进
- Windows 支持
- 扩展 ZGC 到 Windows 平台。
CMS 移除
- 正式移除 CMS,建议迁移到 G1 或 ZGC。
JDK 15 的 GC 改进
ZGC 正式发布
- ZGC 成为正式功能,推荐用于生产环境。
Shenandoah GC 正式发布
- Shenandoah 成为正式功能,推荐用于生产环境。
JDK 16 的 GC 改进
弹性元空间(Metaspace)
- 动态调整元空间大小
- 根据应用需求自动调整元空间内存占用。
- 减少内存碎片
- 优化元空间内存分配,减少碎片化。
JDK 17 的 GC 改进
G1 改进
- 增量并行 Full GC
- 将 Full GC 分为多个阶段,进一步减少停顿时间。
ZGC 改进
- macOS 和 Windows 支持优化
- 提升 ZGC 在 macOS 和 Windows 上的性能。
JDK 21 的 GC 改进
分代 ZGC(预览)
- 分代模型
- 将堆分为年轻代和老年代,优化回收效率。
- 低延迟
- 进一步降低年轻代的回收延迟。
JDK 22 的 GC 改进
分代 ZGC 正式发布
- 分代 ZGC 成为正式功能,推荐用于生产环境。
JDK 23 的 GC 改进(预计)
分代 ZGC 优化
- 年轻代回收效率提升
- 进一步优化年轻代的回收算法。
- 堆内存扩展
- 支持更大的堆内存(如 32TB)。
GC 算法对比
GC 算法 | 分代模型 | 特点 | 适用场景 |
---|---|---|---|
Serial GC | 分代 | 单线程,低开销 | 小型应用,单核环境 |
Parallel GC | 分代 | 多线程,高吞吐量 | 计算密集型应用 |
CMS | 分代 | 低停顿,并发回收 | 延迟敏感应用(已弃用) |
G1 GC | 分区(Region) | 低停顿,适合大堆内存 | 通用场景 |
ZGC | 无分代/分代 | 亚毫秒级停顿,超大堆内存支持 | 延迟敏感,大内存应用 |
Shenandoah | 无分代 | 低停顿,并发回收 | 延迟敏感应用 |
升级建议
- 默认 GC
- JDK 8 → JDK 11:从 Parallel GC 切换到 G1。
- JDK 17+:优先使用 ZGC 或 Shenandoah。
- 延迟敏感应用
- 启用 ZGC 或 Shenandoah,确保亚毫秒级停顿。
- 大内存应用
- 使用 ZGC,支持 TB 级堆内存。
通过升级 JDK 并选择合适的 GC 算法,可以显著提升应用的性能和稳定性。
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。