Bootstrap

如何选择正确的 JDK 版本?

0.前言

保持 JDK 最新不仅重要,而且是明智之举。通过保持最新,您可以从最新的安全性和性能增强中受益。这意味着即使您的代码保持不变,您的用户的安全性和他们对应用程序的体验也会随着时间的推移而改善。因此,我们强烈建议所有 Java 用户继续使用积极支持的版本,并立即应用关键补丁更新安全补丁。

保持最新有两种途径:您可以应用同一 Java 版本的更新(更新),也可以采用较新的 Java 版本(升级)。这篇博文将提供给您一些关于思考何时更新和何时升级的建议。

在深入探讨之前,有必要澄清我们将在本文中使用的一些术语。功能版本是可以更改 Java SE 规范的版本:可以添加、弃用或删除 API、工具和其他功能。功能版本通常按其编号表示:JDK 21、JDK 17、JDK 8 等。

1.更新与升级如何选择?

在大多数情况下,更新是一个简单的练习:不兼容的风险很小,对系统的稳定性和安全性有明显的好处,偶尔会有修复可以提高性能。有时您必须更新以管理固件或操作系统中的更改,获得新的加密算法并禁用可能不安全的算法,并使用新硬件。

升级(例如从 JDK 21 升级到 JDK 22)的成本可能高于“更新”,但相应的好处也更多:开发人员可以获得新的语言功能、新工具和新 API,这使得编写和维护现有应用程序变得更加容易。对于现有应用程序,即使代码未更改或应用程序未重新编译,新的 JDK 功能版本也可以提供更大的性能改进。较新的 JDK 版本(取决于您的工作负载)通常启动速度更快(启动)、更快达到峰值性能(预热)、运行速度更快(吞吐量)并更好地利用可用资源。它们可以引入更好的监控和调试工具,并启用更新的专用部署模型。另一方面,功能版本也可能会删除或弃用旧 API、淘汰旧工具、停止支持旧操作系统和架构,并要求更新第三方工具、库和工具链。为了避免这些成本和风险,一些开发人员和管理员选择长期使用单一版本。

乍一看,似乎用户需要满足两个相互竞争的目标才能最大限度地发挥使用 Java 的优势。现有应用程序应该尽可能长时间地工作,并且尽可能少地进行更改(除了将 JDK 更新到当前更新版本)。另一方面,当开发人员能够使用新功能版本附带的新语言功能、API 和开发实践时,他们的工作效率会更高。我们应该要求开发人员使用与一般实践和现有示例代码越来越不一致的旧编码实践多长时间?性能提升有多大或多小,在哪些方面,值得采用新版本的成本?平衡这些目标的最佳方法是什么?

2.使用多个运行时环境

您不必强制要求所有 Java 应用程序使用一个 JDK 功能版本。过去,Java 每隔几年才有一个主要版本,而且大多数硬盘以兆字节为单位,因此每个 Java 应用程序都有自己的 Java 运行时的情况并不常见。相反,服务器中的所有应用程序共享一个 Java 运行时是很常见的,而为一个应用程序切换 Java 运行时意味着为所有应用程序更改它。为了确保升级一个应用程序不会迫使其他应用程序过早升级,组织通常选择为每个应用程序标准化一个特定的 Java 版本。想要升级到新运行时的组织有“标志日”,所有应用程序(无论是生产中的还是开发中的)都必须同时升级到相同的新运行时。

这些全有或全无的升级策略不再有意义。现代服务器拥有比以前更多的内存和存储空间。容器现在提供了一种在不牺牲系统隔离的情况下共享硬件的方法;现在将应用程序容器化以便每个应用程序都可以拥有自己的 Java 运行时是很常见的。 jlink 和 java packager 等工具可让应用程序开发人员更轻松地将 Java 运行时与其应用程序捆绑在一起。不再需要为所有用例使用单个 Java 功能版本;每个应用程序都可以拥有自己的运行时,因此可以按照自己的节奏运行。务必确保所有运行时都与最新更新版本保持同步,并且不要使用任何停产 (EOL) 版本,这样您才能从安全性和性能增强中受益。

3.针对特定的应用程序应该使用那个版本的JDK?

决定在哪个 JDK 版本上运行应用程序将取决于应用程序在其生命周期中的位置。

如果开发人员正在积极开发应用程序,要求他们升级到较新的功能版本是合理的。一旦应用程序不再处于积极开发状态,就不应该要求开发人员在没有充分理由的情况下更新到新的功能版本,例如通过更好的应用程序性能节省成本,或者对于长期存在的应用程序,他们使用的版本的支持即将终止。生产中的非平凡、稳定的应用程序应使用 LTS 版本。

对于至少一年内不会投入生产的新的复杂项目,即使不是 LTS,也要使用最新的 JDK 功能版本。在下一个 LTS 到来之前,您的代码甚至可能还没有最终确定;通过从最新版本开始并尽早采用下一个 LTS,您可以最大限度地延长代码在稳定 LTS 版本上运行的时间。与往常一样,您需要注意,您希望使用的任何第三方工具和库都受您计划使用的 JDK 版本支持。

对于计划在一年内发布的新代码,请使用已发布至少九个月的最新 LTS 版本或较新的功能版本。使用已发布至少九个月的 LTS 的原因是,您的应用程序可能依赖于第三方组件,而九个月的等待时间可以让这些第三方有时间确认这些组件是否完全支持 LTS 版本。如果 LTS 版本已发布九个月以上,并且依赖项尚未更新以支持它,请考虑用更积极维护的替代方案替换您的依赖项。

如果您的应用程序正在积极更新,并且正在测试和添加新功能,请考虑在该 LTS 发布后的两年内将其迁移到新的 LTS。如果您的开发人员仍在开发应用程序,他们可以测试并解决迁移要求,作为应用程序整体维护的一部分。确保您的应用程序在停止主动更新并达到“保持原样运行,不做任何更改”状态之前处于最新的 LTS 状态,这将再次最大限度地延长您在 LTS 终止支持之前可以依赖它的时间。

如果您的应用程序正在运行但未主动更改,请继续使用您已经使用的功能版本,除非:

  • 该 JDK 版本的生命周期还剩不到一年
  • 该应用程序依赖的工具和/或第三方库在 JDK 版本本身之前终止支持
  • 该应用程序使用了太多内存或 CPU
  • 在情况需要时,升级“稳定”应用程序应该是一个可以考虑的选项。 您可以通过升级获得性能优势,延长应用程序的支持生命周期,或者您可以利用 Java 的巨大稳定性并使用将要执行升级的资源来开发新应用程序。

4.结论

通过保持 JDK 最新并遵循此处介绍的指南,您可以最大限度地利用 Java 的所有优势:稳定性、安全性以及启动、预热、吞吐量和资源使用方面的持续改进。

;