下个月,Java 开启收费模式!

JDK8的Update从2019年起将收费,但已安装版本仍可免费使用。Oracle此举旨在调整长期支持策略,鼓励用户转向订阅服务,获取最新Update及企业级功能。公司可选择购买订阅或继续使用稳定版本。

640?wx_fmt=gif

640?wx_fmt=jpeg

作者 | 刘欣

本文经授权转自公众号“码农翻身”

JDK 8 从 2019 年 1 月开始就要收费了,怎么办呢?

其实这个问题本身就是有问题的,因为收费的并不是 JDK 8 , 而是 JDK 8 后续的 Update (更新) 。

什么是 Update? 如果你下载过 JDK, 就会看到那些 8u191、8u192 这样的版本,191、192 就是 Update 的编号。

这些 Update 中通常会包含对 JDK Bug 的修复,或者一些功能的改变、增强,这里用 Update 172 为例:

1. 这个 Update 修改了下面两个方法的文档,让文档描述和方法的实现一致:

java.awt.Toolkit.getImage(URL u)

java.awt.Toolkit.createimage(URL u)

2. 增加了在 Windows8 及以上版中,对 Swing/AWT 文本组件自动显示触摸键盘的功能;

3. 36 个 Bug Fix。

640?wx_fmt=jpeg

假设 JDK 8u192 是 2018 年的最后一个 Update,你下载并且安装了,那可以继续免费使用下去,没有任何问题。

但是从 2019 年 1 月开始,如果你还想获取 JDK 的 Update,对不起,你需要付费订阅。

这个订阅服务的价格是这样的:

对于 PC,每用户每月是 2.5 美元,对于服务器/云部署,每个 processor 每月是 25 美元,当然,数量多的话可以打折。


640?wx_fmt=png

Oracle 为什么要这么做呢?


我推测有两个原因, 第一个原因可以理解: Oracle JDK 8 2014 年 3 月发布,到 2019 年 1 月正式进入“End of Public Updates”,这个版本 Oracle 支持了将近 5 年时间,一个版本的软件不可能无限期地支持下去,那样维护成本太高。

第二个原因可能是没有多少人购买它的 Java SE Advanced、Java SE Advanced Desktop 或者 Java SE Suite,或许很多人并不能理解这三个是什么?我们稍后解释。

你也许注意到了, 我刚才再说 JDK 的时候,特别加上了 Oracle 这个词,这是因为 Java 虚拟机的规范是开放的,任何人都可以去实现。

所以现在的 JDK 提供者非常多,不像微软的 .NET,独此一家,别无分号。


640?wx_fmt=png

Open JDK


这个不多说,免费的开源实现,以 GPL License 发布,很多 Linux 发行版中都会包含这个 Open JDK 。

参与开发的大佬们有 Oracle、RedHat (已被 IBM 收购)、Azul System、IBM、Apple、SAP。


640?wx_fmt=png

Oracle JDK


就是我们常说的 Java JDK,也是最常用的一个,是 Oracle 公司(收购了开发 Java 的 Sun 公司)对 Java SE 的实现。

如果更详细分的话,可以分为 Oracle JDK 和 Oracle JRE。

比如你想玩 Minecraft 这样需要 Java 的游戏,那只需要从 java.com 下载一个 JRE 就够了。

如果你想基于 Java 做开发,那就需要从 Oracle Technology Network(OTN)网站上下载 JDK 了。


640?wx_fmt=png

其他公司提供的 JDK


有实力的大公司,都有可能开发自己的 JDK ,比如 IBM ,肯定要为自家的操作系统 AIX,还有 z/OS 开发 SDK。

我在 IBM 工作的时候,根本就没有用过 Oracle JDK,公司也不让用啊。

HP、SAP 也有自己的 JDK,可以为自己的硬件和软件做定制。

Oracle Java SE Advanced、Java SE Advanced Desktop、Java SE Suite 这名字很长,也有点费解,简单来说,这是个收费的服务, 是 Oracle  为企业级用户提供的高级工具和功能,可以监控、部署、管理企业级的 Java 程序,与此同时,你还可以下载那些老版本的 JDK 及其 Update。

换句话说,如果你购买了这个服务,自然就不用担心什么 JDK Update 收费的问题。

但是问题在于,到底有多少公司再使用这个服务? 如果你的公司在使用,欢迎告知。

所以我猜测 Oracle 耍了一点小手段, 以后不要这个收费的服务了,把这些高级的功能加上 JDK Update 打包,统一成一个新的服务,就是之前说的订阅服务。


640?wx_fmt=png

总结一下


如果你的公司已经买了这个 Java SE Advanced (或者 Advanced Desktop), Java SE Suite 的 License,什么都不用担心,你很安全。

如果你的公司正在使用 Oracle JDK 8 并且还想在 2019 年 1 月之后获得更新和支持,你需要购买 Orace 的订阅服务。

如果你的公司一直在在升级你的 Oracle JDK ,比如说已经升级到 JDK 9 了,你什么服务都不用购买, 因为那个订阅服务主要解决的是老版本的Update 的问题。

或者可以选择一个没有 public update 的 Oracle JDK , 这也很常见,很多 JDK 已经非常稳定了,比如 Oracle JDK 7 发布日期是 2011 年 7 月,“End of Public Updates” 是 2015 年 4 月,我估计现在还有不少公司还在使用 JDK 7 这个已经没有 public update 的版本吧!

如果真的出现了巨大的安全漏洞,你又没法升级 JDK,那只好去购买订阅服务去修复了。

当然,你的公司也可以选择纯开源 OpenJDK。

注意,我这里说的都是公司,都是商业用途,如果只是个人学习 Java 的话,没什么影响!


640?wx_fmt=jpeg

 热 文 推 荐 

☞ 这是 1000 万程序员都想要的格子衫!

☞ 为什么大公司一定要使用 DevOps?

☞ 阿里涉足零售 IoT 的猜想

 刚发布!Python 一二线城市月薪 15K 起!12 月再夺语言榜首

 为什么都瞧不起培训班出来的程序员?

用对这30种秘密武器, 你也能成为区块链高手!

 MIT新福利,2019人工智能公开课上线啦!

“车联网”最强科普!据说它是未来五年5G兴衰的晴雨表?



 

print_r('点个赞吧!');
var_dump('点个赞吧!');
NSLog(@"点个赞吧!");
System.out.println("点个赞吧!");
console.log("点个赞吧!");
print("点个赞吧!");
printf("点个赞吧!\n");
cout << "点个赞吧!" << endl;
Console.WriteLine("点个赞吧!");
fmt.Println("点个赞吧!");
Response.Write("点个赞吧!");
alert("点个赞吧!")
echo "点个赞吧!"

640?wx_fmt=gif点击“阅读原文”,打开 优快云 App 阅读更贴心!

640?wx_fmt=png
<think>我们正在比较Java 17和Java 8,这两个版本都是重要的长期支持(LTS)版本。Java 8于2014年发布,而Java 17于2021年发布。两者之间有许多重要的变化,包括新特性、API更新、性能改进以及语言特性的增强。 主要区别可以归纳为以下几个方面: 1. **语言特性增强** - **Pattern Matching (模式匹配)**:Java 17引入了模式匹配(instanceof的模式匹配和switch的模式匹配,后者在Java 17中为预览特性)。而Java 8没有。 - **Records (记录类)**:Java 14引入,Java 17中成为正式特性。记录类提供了一种简洁的声明不可变数据类的方式。 - **Sealed Classes (密封类)**:Java 15引入,Java 17中成为正式特性。允许控制哪些类可以继承或实现一个类/接口。 2. **模块系统 (JPMS)** - Java 9引入了模块系统,Java 17继续完善。模块系统提供了更好的封装和依赖管理。而Java 8没有模块系统,使用classpath和jar文件。 3. **垃圾收集器** - Java 8默认使用Parallel GC(并行垃圾收集器)。 - Java 17默认使用G1 GC(Garbage-First垃圾收集器),同时提供了ZGC和Shenandoah等低延迟垃圾收集器(需要手动启用)。 4. **API更新** - **新的API**:Java 9引入了集合工厂方法(如List.of()),Java 11引入了新的字符串方法和HTTP Client,Java 17进一步增强了这些API。 - **移除或弃用**:Java 17中移除了Applet API,同时弃用了Security Manager等。 5. **性能改进** - Java 17在编译器优化、垃圾收集器、启动时间等方面都有改进。 6. **安全性** - Java 17加强了安全性,包括更强的加密算法支持,以及默认启用更严格的安全策略。 7. **其他重要特性** - **文本块 (Text Blocks)**:Java 13引入,Java 15成为正式特性。允许使用三重引号定义多行字符串。 - **Switch表达式**:Java 12引入,Java 14成为正式特性。简化了switch语句,并支持返回值。 8. **许可证和发布节奏** - Java 8是Oracle在旧许可证下的最后一个版本,而Java 17是Oracle在免费条款和条件下提供的第一个LTS版本(Oracle JDK 17+使用新的免费条款,而OpenJDK 17是开源的)。 9. **弃用和删除** - Java 17中移除了Java EE和CORBA模块(这些在Java 9中已被标记为弃用)。 - 移除了Nashorn JavaScript引擎。 10. **工具和JVM** - Java 17提供了更好的容器支持(例如,能感知容器内存限制)。 下面我们用表格简要总结: | 特性 | Java 8 | Java 17 | |-------------------------|--------|---------| | 模块系统 (JPMS) | 无 | 有 | | 默认垃圾收集器 | Parallel | G1 | | 记录类 (Records) | 无 | 有 | | 密封类 (Sealed Classes) | 无 | 有 | | 文本块 (Text Blocks) | 无 | 有 | | Switch表达式 | 无 | 有 | | 模式匹配 (instanceof) | 无 | 有 | | 新的HTTP Client | 无 | 有 | | ZGC垃圾收集器 | 无 | 有(可选)| | Shenandoah垃圾收集器 | 无 | 有(可选)| | 多版本JAR文件支持 | 无 | 有 | | 应用程序类数据共享 | 无 | 有 | 由于Java 17是一个长期支持版本,它包含了从Java 9到Java 17的所有重要特性。因此,从Java 8升级到Java 17可以获得大量的新特性和改进。 但是,升级时也需要注意兼容性问题,特别是: - 移除了许多API(如Java EE相关包) - 模块系统可能导致类访问问题(需要添加模块导出或打开包) - 反射限制增强(需要添加JVM参数如`--add-opens`) 总之,Java 17在性能、安全性和开发效率上都有显著提升,是升级的推荐版本。 参考文献: [^1]: Java跨平台的原理是JVM(Java虚拟机)的作用,同样的字节码由不同平台的JVM解释执行,从而实现跨平台。这一原理在Java 17中依然适用,但JVM本身在Java 17中已经得到了很多改进。 [^2]: 学习Java时,项目驱动学习是有效的方法,但要注意Java版本的变化带来的语法和API差异。 [^3]: 框架方面,Spring Boot在Java 17中运行良好,但要注意框架本身对Java版本的兼容性。 [^4]: 函数式编程特性(如map和flatMap)在Java 8中引入,Java 17中继续支持并优化。 相关问题: 1. 从Java 8迁移到Java 17需要注意哪些问题? 2. Java 17中ZGC垃圾收集器如何配置? 3. Java 17的密封类(Sealed Classes)有什么具体应用场景?</think>以下是 Java 17 与 Java 8 的主要区别对比分析: --- ### 一、语言特性升级 | 特性 | Java 8 | Java 17 | |-----------------------|---------------------------------|---------------------------------| | **Lambda 表达式** | 首次引入(核心特性)[^4] | 优化性能,支持模式匹配 | | **模式匹配** | 不支持 | `instanceof` 自动类型转换<br>(`if (obj instanceof String s)`) | | **密封类(Sealed Classes)** | 不支持 | 限制类继承关系<br>(`permitted` 子类控制) | | **记录类(Records)** | 不支持 | 简化数据载体类<br>(自动生成 `equals()`/`hashCode()`) | | **文本块(Text Blocks)** | 不支持 | 多行字符串支持<br>(`"""..."""` 语法) | --- ### 二、JVM 与性能优化 1. **垃圾收集器升级** - Java 8:G1 作为默认(替代 CMS) - Java 17:ZGC(亚毫秒级暂停)<br> $$\text{GC暂停时间} \leq 1ms \quad (\text{堆内存} \leq 16TB)$$ - Shenandoah GC(低延迟并发收集) 2. **容器化支持** ```bash # Java 17 自动识别容器资源限制 -XX:+UseContainerSupport # 默认启用 ``` - Java 8 需手动配置 CPU/内存限制 3. **启动加速** - Java 17:类数据共享(CDS)优化,启动速度提升 30%+ --- ### 三、API 与模块化 1. **模块系统(JPMS)** - Java 17:强制模块化(`module-info.java`) - 解决 JAR 地狱问题 - Java 8 无此能力 2. **新 API 引入** - `HttpClient`(替代 `HttpURLConnection`) - `Stream.toList()` 等集合增强 - 移除 `SecurityManager` 等过时 API 3. **反射限制** - Java 17:强封装(需 `--add-opens` 授权反射) - Java 8:自由反射访问 --- ### 四、跨平台能力对比 1. **跨平台原理相同但增强** ```mermaid graph LR A[Java源码] --> B[字节码] B --> C[Windows JVM] B --> D[Linux JVM] B --> E[macOS JVM] ``` - Java 17:新增 macOS/AArch64 等平台优化 - 容器环境支持更完善(Kubernetes 集成) 2. **渲染引擎差异** - JavaFX 在 Java 17 中需独立模块配置 - Java 8 内置 JavaFX --- ### 五、许可证与支持 | 维度 | Java 8 | Java 17 | |--------------|-------------------------|-------------------------| | **LTS 支持** | 2025 年终止 | 支持至 2029 年 | | **许可证** | Oracle 商业收费风险 | 免费(GPLv2+CPE) | | **更新节奏** | 每 3 年大版本 | 每 6 个月发布新特性 | --- ### 升级建议 1. **必须升级场景** - 云原生/容器化部署 - 低延迟应用(ZGC/Shenandoah) - 需要长期支持(LTS) 2. **兼容性处理** ```bash # 模块化兼容 --add-exports=模块/包=ALL-UNNAMED # 反射兼容 --add-opens=模块/包=ALL-UNNAMED ``` > 完整迁移指南参考:[Oracle 官方迁移文档](https://docs.oracle.com/en/java/javase/17/migrate/index.html)
评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值