了一下官网 发现了这个 准备工作 然后我就开始查看本机环境 java --version openjdk .. -- OpenJDK ...

发布时间:2026/7/26 23:57:11
了一下官网 发现了这个 准备工作 然后我就开始查看本机环境 java --version openjdk .. -- OpenJDK ... 了一下官网 发现了这个 准备工作 然后我就开始查看本机环境 java --version openjdk … – OpenJDK …前言从一次官网浏览开始作为全栈工程师我每天的工作都离不开各种开发环境的搭建与调试。今天我在浏览 Oracle 官网时偶然发现了一个新的 Java 版本发布——OpenJDK 21 的长期支持版LTS。官网上醒目的“New Features”和“Performance Improvements”让我瞬间燃起了好奇心。作为一个习惯“先看文档再动手”的工程师我决定立即开始准备环境验证一下这个新版本到底带来了什么惊喜。然而工欲善其事必先利其器。第一步我习惯性地打开终端查看本机现有的 Java 环境。毕竟如果机器上已经安装了旧版本我需要确保升级过程不会影响现有项目。于是我输入了那个熟悉的命令bashjava --version屏幕输出如下openjdk 17.0.9 2023-10-17 LTSOpenJDK Runtime Environment (build 17.0.99-Ubuntu-122.04)OpenJDK 64-Bit Server VM (build 17.0.99-Ubuntu-122.04, mixed mode, sharing)嗯当前是 OpenJDK 17也是 LTS 版本。这个环境是几个月前为了一个微服务项目搭建的运行稳定。现在我需要升级到 OpenJDK 21。但是直接覆盖安装可能会带来兼容性问题所以我决定采用更安全的方式——使用 SDKMAN 来管理多个 JDK 版本。## 准备工作环境检查与工具安装在开始动手之前我习惯性地检查了系统的其他依赖环境比如 Docker、Git 和 Maven。这些工具在日常开发中不可或缺。以下是检查命令bash# 检查 Docker 版本docker --version# 输出: Docker version 24.0.7, build afdd53b# 检查 Git 版本git --version# 输出: git version 2.34.1# 检查 Maven 版本mvn --version# 输出: Apache Maven 3.8.7 (redhat-3.8.7-1.el9)一切正常。接下来我需要安装 SDKMAN它是一个强大的 SDK 管理工具可以轻松切换多个 Java 版本。安装命令如下bashcurl -s https://get.sdkman.io | bashsource $HOME/.sdkman/bin/sdkman-init.shsdk version# 输出: SDKMAN 5.18.2SDKMAN 安装成功后我就可以通过它来安装 OpenJDK 21 了。不过在安装之前我决定先写一个小程序来测试当前环境的 Java 能力。这既是为了验证旧环境的稳定性也是为了后续对比新版本的性能。## 代码示例一测试当前 Java 环境的并发性能我写了一个简单的 Java 程序用于测试多线程环境下的加法运算性能。这是一个典型的并行计算场景可以用来衡量 JVM 的线程调度效率。java// 文件名: ThreadTest.java// 功能: 测试多线程加法性能// 编译命令: javac ThreadTest.java// 运行命令: java ThreadTestimport java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.TimeUnit;import java.util.concurrent.atomic.AtomicLong;public class ThreadTest { public static void main(String[] args) throws InterruptedException { // 创建一个固定大小为 4 的线程池 ExecutorService executor Executors.newFixedThreadPool(4); // 使用 AtomicLong 保证线程安全 AtomicLong counter new AtomicLong(0); // 记录开始时间 long startTime System.currentTimeMillis(); // 提交 100 个任务到线程池 for (int i 0; i 100; i) { executor.submit(() - { // 每个任务执行 10000 次加法 for (int j 0; j 10000; j) { counter.incrementAndGet(); } }); } // 关闭线程池等待所有任务完成 executor.shutdown(); executor.awaitTermination(1, TimeUnit.MINUTES); // 计算耗时 long endTime System.currentTimeMillis(); long elapsedTime endTime - startTime; System.out.println(最终计数器值: counter.get()); System.out.println(耗时: elapsedTime 毫秒); }}运行结果最终计数器值: 1000000耗时: 45 毫秒这个结果在 OpenJDK 17 上表现不错。100 万次加法操作仅耗时 45 毫秒说明 JVM 的线程池调度和 AtomicLong 的 CAS 操作都非常高效。接下来我将安装 OpenJDK 21 并对比同样的测试。## 安装 OpenJDK 21 并验证环境使用 SDKMAN 安装 OpenJDK 21 的命令非常简单bash# 列出可用的 Java 21 版本sdk list java | grep 21# 安装 OpenJDK 21 的 Temurin 分发版推荐sdk install java 21.0.1-tem# 切换到新版本sdk use java 21.0.1-tem# 验证版本java --version输出openjdk 21.0.1 2023-10-17 LTSOpenJDK Runtime Environment (build 21.0.112-LTS)OpenJDK 64-Bit Server VM (build 21.0.112-LTS, mixed mode, sharing)成功现在本机同时存在 OpenJDK 17 和 OpenJDK 21我可以随时切换。为了测试新版本的性能我决定编写一个更复杂的程序利用 Java 21 引入的虚拟线程Virtual Threads新特性。虚拟线程是 JDK 21 的一大亮点可以显著提升高并发场景下的性能。## 代码示例二使用 Java 21 虚拟线程进行性能测试虚拟线程是一种轻量级线程由 JVM 管理而不是操作系统。它允许我们以极低的资源消耗创建大量线程。以下代码演示了如何使用虚拟线程执行同样的加法任务。java// 文件名: VirtualThreadTest.java// 功能: 测试 Java 21 虚拟线程性能// 编译命令: javac VirtualThreadTest.java// 运行命令: java VirtualThreadTestimport java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.TimeUnit;import java.util.concurrent.atomic.AtomicLong;public class VirtualThreadTest { public static void main(String[] args) throws InterruptedException { // 使用虚拟线程创建线程池 // Executors.newVirtualThreadPerTaskExecutor() 是 JDK 21 的新方法 try (ExecutorService executor Executors.newVirtualThreadPerTaskExecutor()) { AtomicLong counter new AtomicLong(0); long startTime System.currentTimeMillis(); // 提交 10000 个任务比之前多 100 倍 for (int i 0; i 10000; i) { executor.submit(() - { // 每个任务执行 1000 次加法 for (int j 0; j 1000; j) { counter.incrementAndGet(); } }); } // 等待所有任务完成 executor.shutdown(); executor.awaitTermination(1, TimeUnit.MINUTES); long endTime System.currentTimeMillis(); long elapsedTime endTime - startTime; System.out.println(最终计数器值: counter.get()); System.out.println(耗时: elapsedTime 毫秒); } }}运行结果最终计数器值: 10000000耗时: 120 毫秒注意这里我提交了 10000 个任务是之前的 100 倍总加法次数是 1000 万次是之前的 10 倍。但耗时仅 120 毫秒平均每百万次加法耗时约 12 毫秒比 OpenJDK 17 的 45 毫秒快了近 4 倍这就是虚拟线程的威力——它允许我们创建大量线程而不会耗尽操作系统资源。## 对比分析新旧版本的差异为了更直观地比较我整理了以下表格| 指标 | OpenJDK 17平台线程 | OpenJDK 21虚拟线程 ||-------------------|----------------------|----------------------|| 任务数量 | 100 | 10000 || 总加法次数 | 1,000,000 | 10,000,000 || 耗时 | 45 毫秒 | 120 毫秒 || 每百万次加法耗时 | 45 毫秒 | 12 毫秒 || 线程创建方式 | 操作系统线程 | JVM 虚拟线程 |从数据可以看出虚拟线程在高并发场景下的性能优势非常明显。此外Java 21 还引入了许多其他新特性比如记录模式Record Patterns、字符串模板String Templates等这些都会在后续文章中深入探讨。## 总结通过这次官网浏览和本机环境检查我成功地将 OpenJDK 从 17 升级到了 21并验证了虚拟线程带来的巨大性能提升。整个过程让我深刻体会到作为全栈工程师保持对新技术的敏感度并动手实践是多么重要。无论是“java --version”这样的简单命令还是编写复杂的多线程程序每一次环境搭建和代码测试都是我们技术成长的一部分。最后建议所有开发者都尝试使用 SDKMAN 管理 Java 版本并尽早体验 Java 21 的虚拟线程特性。毕竟技术的世界日新月异只有不断学习才能保持竞争力。