草庐IT

我应该使用哪个版本的 JDK?

ThinkStu 2023-04-15 原文

本文在写作过程中参考了whichJDK

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

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

先说结论:

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


首先介绍不同版本的JDK

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

JDK版本类型发布日期主要更新推荐
8长期支持03/2014lambda先前发布模型下的最后一个 LTS 版本。Oracle 的免费更新已结束,但仍由其他人维护。在接下来的几个月内升级到 11 或 17!
9特征09/2017模块引入了新的发布模型。停产。现在升级到 11 或 17!
10特征03/2018var停产。现在升级到 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 ShenandoahZGC,它们可能是替代方案。

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 构建,其中包括后台端口和一些额外的功能

Tencent Kona

Tencent Kona 8 基于 OpenJDK 8 开发的,所以叫 Kona-8,这个数字是跟 OpenJDK 的版本走的。Kona 是腾讯开源的、免费的、基于 OpenJDK 的发行版本,并且受腾讯长期支持(LTS)和季度更新,目前由腾讯专业的 JVM 技术团队进行维护和开发;在腾讯内部,Kona 就是默认使用的 JDK,主要应用于腾讯云业务场景及其他 Java 应用场景,并且针对超大规模的大数据机器学习和云计算进行了深度优化。

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,但包括一个新的高性能编译器和一个新的多语言虚拟机(可以执行用不同编程语言编写的代码)。还可以创建高度优化且启动速度极快的特定于平台的本机可执行文件。

有关我应该使用哪个版本的 JDK?的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  3. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  4. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  5. ruby - 在 Ruby 中使用匿名模块 - 2

    假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于

  6. ruby - 使用 ruby​​ 和 savon 的 SOAP 服务 - 2

    我正在尝试使用ruby​​和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我

  7. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  8. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  9. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  10. ruby - 在 64 位 Snow Leopard 上使用 rvm、postgres 9.0、ruby 1.9.2-p136 安装 pg gem 时出现问题 - 2

    我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po

随机推荐