你还在使用 JDK 7?JDK 13 都已经来了!五大新特性你最喜欢哪个 ?

就在昨天(2019年09月17日),JDK 13 已经处于 General Availability 状态,已经正式可用了。General Availability(简称 GA)是一种正式版本的命名,也就是官方开始推荐广泛使用了,我们熟悉的 MySQL 就用 GA 来命令其正式版本。

640?wx_fmt=jpeg

从上图我们可以看到 JDK 13 带来了五个大的 Features:

  • 350: Dynamic CDS Archives

  • 351: ZGC: Uncommit Unused Memory

  • 353: Reimplement the Legacy Socket API

  • 354: Switch Expressions (Preview)

  • 355: Text Blocks (Preview)
本文将带领大家来看看这五大特性。
350: Dynamic CDS Archives

这个特性是扩展 JEP310:Application Class-Data Sharing(简称AppCDS,参见 http://openjdk.java.net/jeps/310)的,以允许在 Java 应用程序执行结束时动态归档类,归档类扩展了默认的基础层 CDS (Class-Data Sharing)存档,此特性允许应用的类也可以被放置在共享的归档类(archived classes)文件中。

JEP 350 的主要目标有两个:
  • 提高 AppCDS 的可用性,不需要用户进行试运行来为每个应用程序创建类列表。

  • 由 -Xshare:dump 选项启用的静态归档(Static archiving)应该继续工作,这包括用于内置类加载器和用户定义类加载器的类。

用户可以指定动态存档名称的文件名作为 -XX:ArchiveClassesAtExit 选项的参数。例如,下面的命令创建hello.jsa:
% bin/java -XX:ArchiveClassesAtExit=hello.jsa -cp hello.jar Hello
要使用此动态存档运行相同的应用程序:
% bin/java -XX:SharedArchiveFile=hello.jsa -cp hello.jar Hello
351: ZGC: Uncommit Unused Memory
ZGC 是在 JDK 11 中引入的一个全新的垃圾收集器,它由 Oracle 开发,承诺在数 TB 的堆上具有非常低的暂停时间。但到目前为止,它还没有像 G1 垃圾收集器那样将未使用的堆内存返回到操作系统。这个JEP解决了这个问题,默认情况下启用了这个功能。由于网上有一大堆 ZGC 的文章,所以本文不准备详细介绍 ZGC了。

353: Reimplement the Legacy Socket API

目前 JDK 的 java.net.Socket 和 java.net.ServerSocket 的实现非常古老,这个 JEP为它们引入了一个全新的实现。Java 13 中的默认使用这个实现,但是旧的实现还没有删除,如果还需要,可以通过设置系统属性 jdk.net.usePlainSocketImpl 来使用它们。需要注意的是,并没有为 java.net.DatagramSocket 引入新的实现。
如果使用了新的 java.net.Socket 和 java.net.ServerSocket,在类中初始化 Socket 和 ServerSocket 将会显示出下面的调试信息:

640?wx_fmt=png

上面调试信息输出的 sun.nio.ch.NioSocketImpl 就是新的实现。如果我们需要使用旧的 Socket 实现,可以使用 jdk.net.usePlainSocketImpl 系统属性,这时候调试信息将输出如下信息:

640?wx_fmt=png

从上面信息可以看出,已经是用了旧的 java.net.PlainSocketImpl 实现。

354: Switch Expressions (Preview)

JDK 12 中引入了 Switch 表达式,此时还属于预览特性。JEP 354 修改了这个特性,它引入了 yield 语句,用于从块返回值,而不是使用 break。这意味着,switch表达式需要返回值的时候应该使用 yield, 而需要不返回值应该使用break。

640?wx_fmt=png

注意,这个特性在早期版本是不能使用的。

355: Text Blocks (Preview)

JDK 12 中引入了原始字符串文字特性(http://openjdk.java.net/jeps/326),但在发布之前却被放弃了。JEP 355 在引入多行字符串文字(一个文本块)的意义上是类似的。

与 Python 类似,可以定义多行文本块(而不是使用单行连接),如下所示:

640?wx_fmt=png

上面例子的 lines 变量里面内容第一个字符是 h,最后一个是字符 d,但是字符 d 后面还跟着一个换行符,所以上面 lines 的定义就相当于 String lines="hello iteblog\nhello word\n",如果 lines 字符串最后你不想要 \n,那么你需要这么写:

640?wx_fmt=png

这时候上面的定义就相当于 String lines="hello iteblog\nhello word",大家也可以看出,hello iteblog 和 hello word 字符串前后的空格全部被删除了。

最后,附上 Oracle Java SE Support Roadmap(https://www.oracle.com/technetwork/java/java-se-support-roadmap.html)可以看出 JDK 13 已经从 2019年09月开始可用了。

640?wx_fmt=png

另外,是不是还有很多小伙伴和我一样还在使用 JDK 1.7\1.8 啊?真是坐飞机都赶不上这个社区的节奏。评论区谈谈你在使用的 JDK 版本。

本文主要参考 https://metebalci.com/blog/what-is-new-in-java-13/。


新福利:

从9月11日开始至10月15日截止,一共五周时间,每周二我会从公众号底部留言+转发+在看综合最多的读者中抽取一名读者,免费包邮送实体新书《HBase原理与实践》,留言互动起来吧~

上周获奖名单:AF

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

猜你喜欢

1、

2、

3、

4、

640?wx_fmt=png

扫码关注我们

过往记忆大数据

个人微信号:fangzhen0219

拉你进技术交流群

<think>好的,用户之前问过如何在Mac上检查JDK 17的小版本更新,现在他们又想知道Compressed Archive和DMG Installer的区别。我得先弄清楚这两个术语具体指的是什么。 首先,用户可能是在下载JDK时遇到了这两种安装包选项,不太清楚该选哪个。我需要解释清楚两者的不同,以及各自的适用场景。 Compressed Archive通常是tar.gz或zip文件,适用于需要手动配置环境的情况,比如开发者或者高级用户可能更喜欢这种,因为它更灵活,可以放在任何目录,方便多版本管理。而DMG Installer是Mac的磁盘映像文件,安装过程图形化,自动配置,适合普通用户,尤其是那些不太熟悉命令行的人。 接下来,我需要比较它们的优缺点。比如,Compressed Archive需要手动设置路径,但更轻量;DMG Installer自动安装,但可能占用更多空间。还要提到适用场景,比如团队部署可能用压缩包,个人用户用DMG更方便。 另外,用户可能关心如何选择,所以需要给出建议,根据他们的使用习惯和技术水平来推荐。比如,如果是开发环境需要多版本切换,推荐压缩包;如果是快速安装使用,选DMG。 还要注意用户之前的问题是关于JDK 17的,可能在Mac环境下,所以需要针对Mac系统的情况来讲解,比如DMG在Mac上的使用习惯,而Compressed Archive可能在Linux更常见,但Mac用户也可以使用。 最后,确保用中文清晰解释,结构分明,步骤或对比列表让用户容易理解。可能需要检查是否有遗漏点,比如环境变量配置的具体步骤,或者安装后的验证方法,但根据当前问题,可能不需要深入这些细节,保持回答聚焦在两者的区别和选择建议上。</think>以下是JDK安装包格式`Compressed Archive`和`DMG Installer`的详细对比说明: --- ### 一、核心概念解析 #### 1. **Compressed Archive(压缩归档包)** - **文件格式**:`.tar.gz`(Linux/macOS)或`.zip`(Windows) - **典型文件名**:`jdk-17_linux-x64_bin.tar.gz` - **本质**:未封装的二进制文件集合 - **特点**: - 需手动解压到指定目录 - 需要**自行配置环境变量** - 适合:多版本共存/自定义部署 #### 2. **DMG Installer(磁盘映像安装器)** - **文件格式**:`.dmg`(macOS专属) - **典型文件名**:`jdk-17_macos-x64_bin.dmg` - **本质**:macOS标准化安装容器 - **特点**: - 双击自动挂载虚拟磁盘 - 包含图形化安装向导 - **自动配置系统路径** --- ### 二、技术特性对比 | 特性 | Compressed Archive | DMG Installer | |--------------------|-------------------------------------|--------------------------------| | 安装方式 | 手动解压 | 图形化向导安装 | | 环境变量配置 | 需手动修改`.bashrc`/`.zshrc` | 自动完成 | | 文件权限 | 需自行设置可执行权限 | 自动分配正确权限 | | 系统集成度 | 低(自由度高) | 高(与系统深度整合) | | 卸载方式 | 直接删除解压目录 | 需通过`/Library/Java/JavaVirtualMachines`删除 | | 更新维护 | 需手动替换文件 | 通过安装包覆盖升级 | --- ### 三、典型使用场景 #### 1. **优先选择压缩归档包的情况** - 需要同时安装多个JDK版本(如17+1117+8共存) - 服务器环境部署(通过脚本自动化解压) - 需要自定义安装路径(如`/opt/java/jdk17`) - 开发人员构建CI/CD流水线时 #### 2. **优先选择DMG的情况** - 个人开发机快速安装 - 不熟悉终端操作的新手 - 需要自动配置`JAVA_HOME`路径 - 希望获得Apple公证的安装包(通过Gatekeeper验证) --- ### 四、操作流程差异 #### 压缩包部署示例(macOS): ```bash # 解压并移动到标准目录 tar -xzf jdk-17_macos-x64_bin.tar.gz sudo mv jdk-17.jdk /Library/Java/JavaVirtualMachines/ # 配置环境变量 echo 'export JAVA_HOME=$(/usr/libexec/java_home -v 17)' >> ~/.zshrc source ~/.zshrc ``` #### DMG安装流程: 1. 双击`.dmg`文件挂载磁盘 2. 拖动JDK图标到`Applications`文件夹 3. 系统自动完成以下操作: - 创建`/usr/bin/java`符号链接 - 注册到`/usr/libexec/java_home`数据库 - 设置默认文件关联 --- ### 五、版本更新差异 - **通过压缩包升级**:需下载新压缩包,替换原有目录 - **通过DMG升级**:直接运行新版安装器,自动保留用户配置 - **重要提示**:两种方式安装的JDK会共存于`/Library/Java/JavaVirtualMachines`,需用`java_home`命令切换版本 --- ### 六、验证安装完整性 无论采用哪种方式,最终都可通过以下命令验证: ```bash /usr/libexec/java_home -V # 查看所有已安装JDK java -version # 验证运行时版本 javac -version # 验证编译器版本 ``` 建议开发者优先使用压缩包以获得更大控制权,普通用户推荐DMG安装以降低维护成本。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值