## 为什么选择 Java 21 LTS
- LTS 版本适合生产环境长期维护,生态与工具链成熟。
- 21 版正式引入虚线程(JEP 444)与多项语言特性(JEP 441、JEP 440),在高并发与代码可读性方面收益显著。
## 核心特性与场景
### 虚线程(Virtual Threads, JEP 444)
- 适用场景:大量阻塞型 I/O(HTTP、JDBC、文件、RPC),简化线程管理并提升吞吐。
- 关键点:虚线程是轻量用户态线程,调度由 JVM 托管;仍需正确处理同步与限流。
示例(推荐执行器用法):
import java.util.concurrent.*;
public class VirtualThreadsDemo {
public static void main(String[] args) throws Exception {
try (ExecutorService es = Executors.newVirtualThreadPerTaskExecutor()) {
Future<String> f1 = es.submit(() -> fetch("https://example.com/api/1"));
Future<String> f2 = es.submit(() -> fetch("https://example.com/api/2"));
System.out.println(f1.get());
System.out.println(f2.get());
}
}
static String fetch(String url) throws Exception {
// 伪代码:阻塞 I/O(例如 HttpClient 或 JDBC)
Thread.sleep(100); // 用真实 I/O 替代
return "ok:" + url;
}
}
直接启动虚线程:
Thread.ofVirtual().start(() -> {
try {
// 阻塞 I/O 工作
Thread.sleep(100);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
});
注意:
- 虚线程不消除锁竞争与临界区阻塞;若使用 `synchronized` 或阻塞队列,仍需设计好并发控制与背压。
- 使用连接池时,需评估池大小与服务器并发限制,避免“过度并发”导致下游饱和。
### 模式匹配 for switch(JEP 441)
sealed interface Shape permits Circle, Rectangle {}
record Circle(double r) implements Shape {}
record Rectangle(double w, double h) implements Shape {}
static double area(Shape s) {
return switch (s) {
case Circle c -> Math.PI * c.r() * c.r();
case Rectangle r -> r.w() * r.h();
};
}
### 记录模式(Record Patterns, JEP 440)
record Point(int x, int y) {}
static String quadrant(Object o) {
if (o instanceof Point(int x, int y)) {
if (x >= 0 && y >= 0) return "Q1";
if (x < 0 && y >= 0) return "Q2";
if (x < 0 && y < 0) return "Q3";
return "Q4";
}
return "N/A";
}
## 性能与 GC 调优
### 启动参数与日志
- 基本堆配置:`-Xms<size>` 与 `-Xmx<size>`(生产建议相等,减少动态扩容开销)。
- GC 日志:`-Xlog:gc*`(包含周期、暂停、堆用量等信息)。
示例(G1):
java -Xms2g -Xmx2g \
-XX:+UseG1GC \
-XX:MaxGCPauseMillis=200 \
-Xlog:gc* \
-jar app.jar
示例(ZGC):
java -Xms2g -Xmx2g \
-XX:+UseZGC \
-Xlog:gc* \
-jar app.jar
说明:
- G1 的 `-XX:MaxGCPauseMillis` 为暂停目标,非严格上限;需结合业务延迟指标调整。
- ZGC 面向低暂停场景,暂停一般更稳定;参数较为简洁,关注堆大小与对象生命周期即可。
### 线程与 I/O
- 虚线程适合阻塞 I/O;CPU 密集型任务仍需谨慎并发度,避免抢占造成上下文切换过多。
- 使用限流与舱壁(bulkhead)模式,保护下游:例如并发信号量或固定大小的执行器。
### 观测与分析
- Java Flight Recorder:`-XX:StartFlightRecording=duration=60s,filename=recording.jfr`
- 对 GC 日志与 JFR 进行基线采集,形成回归对照;变更仅在单一维度进行以便归因。
## 部署与运行建议
- 为容器部署设置清晰的堆与栈界限:`-Xms=-Xmx` 与合理的容器内存限额。
- 为虚线程工作负载设置连接池与下游速率限制,避免服务端 429/503。
- 结合 `jlink` 与 `--add-modules` 精简运行时(按需),减少镜像体积与启动时间。
## 迁移提示
- 若使用预览特性(例如结构化并发的预览 API),需 `--enable-preview`:
javac --release 21 --enable-preview MyApp.java
java --enable-preview MyApp
## 验证与基准建议
- 使用 JMH 进行微基准,避免错误结论(JIT 暖机、逃逸分析、循环展开等会影响结果)。
- 用代表性负载进行端到端压测:记录 P50/P95/P99 延迟与 CPU、堆、线程数。
- 每次更改仅调整一个因素(例如:改 GC 或改并发度),保证归因清晰。
## 注意事项
- 关键词与主题一致:本文围绕 Java 21、虚线程、模式匹配与 GC 调优。
- 分类与主题精确匹配:`软件/编程语言/Java`。
- 描述准确概括核心价值:面向 2025 的 LTS 实战与性能优化。
- 技术参数经验证:示例 API 与 JVM 参数均为 Java 21 正式特性或通用选项;预览特性明确标注并给出启用方法。

发表评论 取消回复