应该选择使用哪个版本的 JDK?

2023-11-14

要构建和运行 Java 应用程序,就需要安装 JDK 环境。

OpenJDK 是 Java SE 规范的开源软件,但它只是源代码。二进制发行版由不同的供应商提供,适用于许多受支持的平台,这些发行版在许可证、商业支持、支持的平台和更新频率方面有所不同。

先说结论:

建议使用 Adoptium Eclipse Temurin 17 并确保您的本地版本与 CI 和生产版本匹配。


首先介绍不同版本的JDK

当前,JDK 计划每六个月(即每年的三月和九月)发布一个具有新版本。第三年的9 月发布一个长期支持 (LTS) 版本,承诺最少更新三年。

JDK版本 类型 发布日期 主要更新 推荐
8 长期支持 03/2014 lambda 先前发布模型下的最后一个 LTS 版本。Oracle 的免费更新已结束,但仍由其他人维护。在接下来的几个月内升级到 11 或 17!
9 特征 09/2017 模块 引入了新的发布模型。停产。现在升级到 11 或 17!
10 特征 03/2018 var 停产。现在升级到 11 或 17!
11 长期支持 09/2018 新的 HTTP 客户端 广泛使用的 LTS 版本。计划在未来几个月内升级到版本 17。
12 特征 03/2019 停产。现在升级到17!
13 特征 09/2019 停产。现在升级到17!
14 特征 03/2020 新的Switch表达式 停产。现在升级到17!
15 特征 09/2020 文本块 停产。现在升级到17!
16 特征 03/2021 记录 停产。现在升级到17!
17 长期支持 09/2021 密封类 当前的 LTS 版本。立即更新至 17.0.3+!
18 特征 03/2022 默认为 UTF-8 坚持17! 这是一个没有重要功能的短期版本。-Dfile.encoding=UTF-8您可能想通过在当前的 JDK 中进行设置来检查是否遇到“默认 UTF-8”的任何问题。
19 特征 09/2022 仅预览和孵化器功能 坚持17! 如果您之前升级到 18,请立即升级到 19。

您必须决定是要坚持使用最新的 LTS 版本,还是要使用最新的功能版本并每六个月升级一次。两种选择都可以,但如果您不确定,请坚持使用最新的 LTS 版本。

​OpenJDK 项目本身在openjdk.java.net上进行管理,您可以在其中找到规范、源代码和邮件列表,但没有可供下载的构建版本。您需要选择一个发行版。

不同的厂商版本:

Oracle OpenJDK 

Oracle 以压缩存档格式为 Linux、macOS 和 Windows 提供 OpenJDK 构建。

这些构建只会更新 6 个月。在此短时间后将无法获得更新和安全补丁。这也适用于 LTS 版本!例如,最新的 OpenJDK 11 版本是11.0.2+9而当前的 OpenJDK 版本是11.0.12+7。

Oracle Java SE Development Kit (JDK)

Oracle 提供了 OpenJDK 的商业版本,它基于与 OpenJDK 完全相同的来源:Oracle Java SE Development Kit (JDK)。Oracle 为这些构建提供更新定期更新和安全补丁。

Adoptium Eclipse Temurin

Eclipse Adoptium是Eclipse Foundation旗下的顶级项目,为开源软件提供资源和专业的治理模型。Adoptium 工作组由对 Java 技术有战略兴趣的主要公司和组织组成,包括 Red Hat、IBM、Microsoft、Azul 和 iJUG。之前的 AdoptOpenJDK 项目已经迁移到 Eclipse Adoptium。

Adoptium OpenJDK 构建称为Eclipse Temurin,以区分项目和构建。

Eclipse Temurin 构建是高质量的、供应商中立的,并且在宽松许可下经过了 TCK 测试。

Adoptium 表示,只要积极维护相应的上游源代码,它将继续为 LTS 版本构建二进制文件。

AdoptOpenJDK

AdoptOpenJDK 项目是 Eclipse Adoptium 的前身,为默认的 HotSpot 和 OpenJ9 虚拟机提供高质量的 OpenJDK 构建。

Azul Zulu

Azul Systems, Inc. 专注于专业的 Java 技术和 JDK 的商业支持。Azul 在业界享有很高的声誉,并参与了各种工作组来发展 Java 平台。

Azul为许多操作系统和架构提供名为Azul Zulu的开源 OpenJDK 构建。此外,Azul 还提供满足特殊要求的构建,例如精简的 JRE 和包含 OpenJFX 的构建。

这些构建的缺点是依赖于一家公司,这可能会突然更改其许可或更新政策。

Azul Zing

Azul Zing 是一个商业 JDK,目前作为Azul Platform Prime销售。它需要与 Azul Systems 签订商业合同才能用于生产。

Zing 基于 OpenJDK,并添加了获得专利的“C4 无间断垃圾收集器”、“Falcon JIT 编译器”(以更高的 CPU 使用率和更长的启动和预热时间为代价优化吞吐量)和一些功能加快编译器预热时间(通过分析和存储文件中训练运行的优化来减轻 Falcon JIT 编译器较慢的预热时间)。

Azul Zing 在金融交易应用程序中有一些用例,其中 GC 暂停是一个问题。除此之外,常规 OpenJDK 包含免费的低暂停时间 GC Shenandoah和ZGC,它们可能是替代方案。

BellSoft Liberica JDK

与Azul类似,BellSoft专注于专业的Java技术和对JDK的商业支持。此外,BellSoft 在业界享有很高的声誉,并参与了各种工作组来发展 Java 平台。

BellSoft为几乎所有操作系统和架构提供名为Liberica JDK的开源 OpenJDK 构建。

流行的 Spring Boot 框架选择 Liberica JDK 作为其buildpack的运行时。

这些构建的缺点是依赖于一家公司,这可能会突然更改其许可或更新政策。

IBM Semeru Runtime

IBM 开发了自己的 Java 虚拟机版本,称为 J9,并作为Eclipse OpenJ9 开源。它是默认 HotSpot Java 虚拟机的替代品,但它从未获得太多人气。

IBM 现在提供基于 Eclipse OpenJ9 Java 虚拟机和一些 OpenJDK 类库的名为Semeru Runtime的构建。

OpenJ9内存占用低,使用共享类启动速度快,但与 Hotspot 虚拟机相比吞吐量较低。

Amazon Corretto 

由于 Oracle 改变了对其 OpenJDK 构建的支持和许可政策,主要的云提供商决定建立自己的托管 OpenJDK 构建并提供长期更新。显然,这是为了规避风险,尤其是对甲骨文的诉讼。

2018 年,AWS 发布了Corretto,这是另一个 OpenJDK 构建。

AWS 包括来自较新 OpenJDK 版本的错误修复的反向端口,并声称他们将添加可能尚未集成到 OpenJDK 项目中的补丁。亚马逊已经实施了一个替代加密提供商,该提供商已针对其服务进行了优化。它计划用作 Corretto 中的默认加密实现。

Amazon 为主要开发平台提供发行版,并为其自己的 Amazon Linux 2 提供优化版本。

Microsoft  OpenJDK 

2021 年,微软发布了 OpenJDK 的 Microsoft Build,这是另一个 OpenJDK 构建。

Microsoft 可能会包含来自较新 OpenJDK 版本的错误修复的反向端口,并声称他们将添加可能尚未集成到 OpenJDK 项目中的补丁。

Microsoft 为主要开发平台提供版本。

Alibaba Dragonwell

阿里巴巴提供了一个 OpenJDK 构建,其中包括后台端口和一些额外的功能

SapMachine

SapMachine 是另一个 OpenJDK Build,由 SAP 维护。

Red Hat OpenJDK

Red Hat 为 LTS 版本提供 OpenJDK 构建。

OJDK

该项目已停止。ojdkbuild 项目的目标是提供 OpenJDK 的 Windows x86_64 二进制文件,这些二进制文件在行为上尽可能接近 Linux OpenJDK 包,例如,通过使用系统库而不是 zlib 或 OpenSSL 的打包版本。它使用了 CentOS 中包含的软件包。这些构建的一个用例是在 Windows 机器上开发 Java 软件并将它们部署到生产环境中的 Linux 服务器。

GraalVM

GraalVM 是一个完全兼容的 JDK,但与所有其他构建有很大不同。

GraalVM 由 Oracle 开发。它基于 OpenJDK,但包括一个新的高性能编译器和一个新的多语言虚拟机(可以执行用不同编程语言编写的代码)。还可以创建高度优化且启动速度极快的特定于平台的本机可执行文件。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

应该选择使用哪个版本的 JDK? 的相关文章

  • 获取文件的锁

    我想在对特定文件开始 threo read 时获取文件上的锁定 以便其他应用程序无法读取已锁定的文件并希望在线程终止时释放锁定文件 您可以获得一个FileLock https docs oracle com javase 8 docs ap
  • 当路径的点超出视野时,Android Canvas 不会绘制路径

    我在绘制路径时遇到了 Android Canvas 的一些问题 我的情况是 我有一个相对布局工作 如地图视图 不使用 google api 或类似的东西 我必须在该视图上绘制一条路径 canvas drawPath polyPath bor
  • 如何使用 JAVA 代码以编程方式捕获线程转储?

    我想通过 java 代码生成线程转储 我尝试使用 ThreadMXBean 为此 但我没有以正确的格式获得线程转储 因为我们正在使用jstack命令 请任何人提供一些帮助 他们是否有其他方式获取线程转储 使用任何其他 API 我想要的线程转
  • 将SQL数据引入jquery availabletag

    我正在尝试制作自动完成文本框 但如何将 SQL 数据包含到 jquery 可用标记并循环它 我无法根据以下代码执行该功能 任何帮助 将不胜感激 谢谢 这是我的预期输出 预期结果演示 http jsfiddle net VvETA 71 jq
  • 文本在指定长度后分割,但不要使用 grails 打断单词

    我有一个长字符串 需要将其解析为长度不超过 50 个字符的字符串数组 对我来说 棘手的部分是确保正则表达式找到 50 个字符之前的最后一个空格 以便在字符串之间进行彻底的分隔 因为我不希望单词被切断 public List
  • 删除优先级队列的尾部元素

    如何删除优先级队列的尾部元素 我正在尝试使用优先级队列实现波束搜索 一旦优先级队列已满 我想删除最后一个元素 优先级最低的元素 Thanks 没有简单的方法 将元素从原始元素复制到新元素 最后一个除外 PriorityQueue remov
  • 在 Struts 2 中传递 URL 参数而不使用查询字符串

    我想使用类似的 URL host ActionName 123 abc 而不是像这样传递查询字符串 host ActionName parm1 123 parm2 abc 我怎样才能在 Struts 2 中做到这一点 我按照下面的方法做了
  • tomcat 7.0.50 java websocket 实现给出 404 错误

    我正在尝试使用 Java Websocket API 1 0 JSR 356 中指定的带注释端点在 tomcat 7 0 50 上实现 websocket 以下是我如何对其进行编码的简要步骤 1 使用 ServerEndpoint注解编写w
  • Java中的断点和逐步调试?

    抱歉我的问题名称很奇怪 我不知道如何寻找这个 因为我不知道这些东西是如何称呼的 Visual Studio 中至少有一个功能 您可以单击代码左侧并设置一个大红点的起点 然后运行程序 您可以通过按 f8 或 f5 实际上是不同的 f 来跟踪步
  • 在 MongoDB 和 Apache Solr 之间同步数据的简单方法

    我最近开始使用 MongoDB 和 Apache Solr 我使用 MongoDB 作为数据存储 并且希望 Apache Solr 为我的数据创建索引 以实现应用程序中的搜索功能 经过一些研究 我发现 基本上有两种方法可以在 MongoDB
  • 如何通过注解用try-catch包装方法?

    如果应该在方法调用中忽略异常 则可以编写以下内容 public void addEntryIfPresent String key Dto dto try Map
  • 在 Java 中通过 XSLT 分解 XML

    我需要转换具有嵌套 分层 表单结构的大型 XML 文件
  • 无法在 Java/Apache HttpClient 中处理带有垂直/管道栏的 url

    例如 如果我想处理这个网址 post new HttpPost http testurl com lists lprocess action LoadList 401814 1 Java Apache 不允许我这么做 因为它说竖线 是非法的
  • IntelliJ 组织导入

    IntelliJ 是否具有类似于 Eclipse 中的组织导入功能 我拥有的是一个 Java 文件 其中多个类缺少导入 例子 package com test public class Foo public Map map public J
  • 避免 Java 中的重复导入:继承导入?

    有没有办法 继承 导入 Example 常见枚举 public enum Constant ONE TWO THREE 使用此枚举的基类 public class Base protected void register Constant
  • 我可以限制分布式应用程序发出的请求吗?

    我的应用程序发出 Web 服务请求 提供商处理的请求有最大速率 因此我需要限制它们 当应用程序在单个服务器上运行时 我曾经在应用程序级别执行此操作 一个对象跟踪到目前为止已发出的请求数量 并在当前请求超出允许的最大负载时等待 现在 我们正在
  • 如何让 Emma 或 Cobertura 与 Maven 一起报告其他模块中源代码的覆盖率?

    我有一个带有 Java 代码的多模块 Maven 设置 我的单元测试在其中一个模块中测试多个模块中的代码 当然 这些模块具有相互依赖性 并且在测试执行之前根据需要编译所有相关模块中的代码 那么 如何获得整个代码库覆盖率的报告 注意 我不是问
  • JMS 中的 MessageListener 和 Consumer 有什么区别?

    我是新来的JMS 据我了解Consumers能够从队列 主题中挑选消息 那么为什么你需要一个MessageListener因为Consumers会知道他们什么时候收到消息吗 这样的实际用途是什么MessageListener 编辑 来自Me
  • 检查应用程序是否在 Android Market 上可用

    给定 Android 应用程序 ID 包名称 如何以编程方式检查该应用程序是否在 Android Market 上可用 例如 com rovio angrybirds 可用 而 com random app ibuilt 不可用 我计划从
  • ArrayList.clear() 和 ArrayList.removeAll() 有什么区别?

    假如说arraylist定义为ArrayList

随机推荐

  • C语言计算1-100之间的素数

    要计算素数 我们首先要明白素数的性质 也就是我们数学上的质数其实是一样的啦 素数 只能被一和它本身整除的数 这里提一下1既不是质数也不是合数 感觉想把自己说得话注释也挺难的哈 挺多地方写的应该看不懂吧反正我自己也有点看不懂自己写的啥哈哈 运
  • 这7个GitHub高级搜索技巧,你知道吗?

    前言 GitHub作为全球最大的同性交友 代码托管 平台 里面藏着巨大的资源宝库 一套Ctrl C和Ctrl V组合拳打出来 就没有你实现不了的需求 好了 废话不多说 下面介绍7个GitHub搜索高级技巧 让资源搜索不再困难 关键字 in
  • JPA——Date拓展之Calendar

    Java Calendar 是时间操作类 Calendar 抽象类定义了足够的方法 在某一特定的瞬间或日历上 提供年 月 日 小时之间的转换提供方法 一 获取具体时间信息 1 当前时间 获取此刻时间的年月日时分秒 Calendar cale
  • python卸载_可能是全网最详细的 Python 安装教程(windows)

    Python 是这两年来比较流行的一门编程语言 主要卖点是其相对简单的语法以及丰富的第三方库 下面我来带大家安装 配置 Python 文章最后有各种疑难杂症的解决方法 大体步骤有两步 安装 Python 让电脑学会这门语言 配置编辑器 方便
  • 让chatGPT回答一些有趣?无聊的问题

    本来我是没有国外的手机号的 也就没法注册chatGPT并使用 不过好在 csdn 的猿如意 里面有体验功能 我就顺便体验一下 这一次主要是看看chatGPT能否理解我的目的 很可惜 这一次并没有 其实第一次 chatGPT准确的回答出了 自
  • 算法导论 练习 2.2

    2 2 1 答案 n theta n 渐进符号的定义会在第三章里明确给出 所以这里就不写证明了 详细证明见第三章习题 好多好多啊 2 2 2 选择排序 数据结构课程基本排序算法之一 代码 SELECTION SORT A n length
  • 算法研究---MNIST数据集

    MNIST简介 MNIST Mixed National Institute of Standards and Technology database 是一个计算机视觉数据集 它包含70000张手写数字的灰度图片 其中每一张图片包含 28
  • vue3按需导入element-plus后使用ElMessage报错或样式丢失

    在vue项目中已经自动导入element plus 但是直接使用ElMessage时编译会报错 async function userLogin Promise
  • 史上最全《计算机网络 自顶向下方法》答案合集

    史上最全 计算机网络 自顶向下方法 答案合集 封面 英文名 Computer Networking A Top Down Approach 7th Edition 答案 第一章 一 第一章 二 第二章 一 第二章 二 第三章 一 第三章 二
  • .NET Core API框架实战(五) 依赖注入 服务的注册与提供

    ASP NET Core 的底层设计支持和使用依赖注入 ASP NET Core 应用程序可以利用内置的框架服务将它们注入到启动类Startup的方法中 并且应用程序服务ConfigureServices能够配置注入 依赖注入 Depend
  • 【Unity入门计划】利用Cinemachine实现简单的相机跟随&设置相机边界

    目录 使用情景 1 从Packages载入Cinemachine 2 创建2D Camera的Cinemachine 3 设置摄像机跟随玩家角色 4 设置主摄像机边界 5 加上相机跟随和边界的效果 使用情景 Cinemachine是Unit
  • 【20230103】FROM_UNIXTIME和UNIX_TIMESTAMP函数

    首先知道UNIX TIMESTAMP函数的由来 是自 1970 01 01 的道当前时间的秒数差 累似1337276321 一般10位 1 FROM UNIXTIME 函数 FROM UNIXTIME unix timestamp form
  • python 2、python读取.htm文件报错:UnicodeDecodeError: 'utf8' codec can't decode byte 0xb3 in position 0的解决方法

    问题是这样的 我用python写的程序去读取 htm文件中的数据 刚开始我用 fr open 0 htm r 时 程序运行后直接崩溃 后来根据提示的错误信息 ValueError encoding must be one of utf 8
  • 不同文件格式与图像类型

    文件格式 通常有BMP 8 位 24 位 32 位 PNG JPG JPEG GIF PPM PNM 和 TIF 图像类型 单通道图像 每个像素由单个值表示 包括二值 单色 图像 每个像素由一个 0 1 位 和灰度图像 每个像素由 8 位表
  • Kotlin:Android世界的Swift

    转载自 http www infoq com cn news 2015 06 Android JVM JetBrains Kotlin Kotlin 是一门与 Swift 类似的静态类型 JVM 语言 由 JetBrains 设计开发并开源
  • 2019年7月3日星期三 恒指/美原油/美黄金 走势分析

    财经早餐 2019年7月3日重点关注的财经数据与事件 09 45 中国6月财新服务业PMI 15 50 法国6月服务业PMI终值 15 55 德国6月服务业PMI终值 16 00 欧元区6月服务业PMI终值 16 30 英国6月服务业PMI
  • malloc和free,brk和sbrk和mmap和munmap的使用和关系以及内存分配的原理

    目录 一 使用 1 1 malloc和free 2 brk和sbrk 2 1 sbrk 2 2 brk 3 mmap munmap 二 关系 三 内存分配原理 四 malloc底层 一 使用 1 1 malloc和free 参数 申请内存大
  • Android进阶——AIDL详解

    看这篇之前先看看binder Android Binder机制 1 简介 AIDL Android 接口定义语言 可以使用它定义客户端与服务端进程间通信 IPC 的编程接口 在 Android 中 进程之间无法共享内存 用户空间 不同进程之
  • 【第13篇】Bert论文翻译

    文章目录 摘要 1 简介 2 相关工作 2 1 无监督的基于特征的方法 2 2 无监督微调方法 2 3 从监督数据中迁移学习 3 Bert 3 1 预训练BERT 3 2 微调BERT 4 实验 4 1 GLUE 4 2 SQuAD v1
  • 应该选择使用哪个版本的 JDK?

    要构建和运行 Java 应用程序 就需要安装 JDK 环境 OpenJDK 是 Java SE 规范的开源软件 但它只是源代码 二进制发行版由不同的供应商提供 适用于许多受支持的平台 这些发行版在许可证 商业支持 支持的平台和更新频率方面有