Java 12正式发布,新特性解读!

2015-08-01
作者 | 杨晓峰
编辑 | 小智
Java 12 如约而至,除了那些值得关注的特性,你也应该思考下 Java 的未来。
写在前面

在 Java 9 之前,当一个版本被宣布为首选版本,存在一个“培育”(bedded-in)新 GA 版本的重叠期。在此期间,上一个版本将会继续进行免费更新。为确保新旧版本间的干净切换,即便旧版本已不再是首选版本,通常也会继续维护 12 个月以上。但是随着 Java 版本发布更改为遵循严格的时间表后,事实上宣告了传统的免费支持期将寿终正寝。

Oracle 对 Java 8 的官方支持时间持续到 2020 年 12 月,之后将不再为个人桌面用户提供 Oracle JDK 8 的修复更新;在 2019 年 1 月之后,不再提供免费的商业版本更新,届时想要继续获得 Oracle 的商业支持和维护,需付费订阅。

Java 是很多程序员的饭碗,Java 生态圈下的程序员们似乎对于 Oracle 也有诸多不满,当 Java 也像 Android 系统走上版本号的稳定道路后,新版本的发布意义还有那么大吗?Java 12 已经发布了,但使用版本最多的还是 Java 8,你会选择升级吗?


JDK12 如期而至,不知不觉 Java 半年为周期的发布模式(Half-year-cadence)已经成功运行了一年多,OpenJDK 社区和 Oracle 充分展示了其坚决的执行力。今天当然要尝鲜 JDK12 的新特性,与此同时,笔者也会从不同角度,来分析新发布模式是否达到了其初衷。

下载地址:

https://www.oracle.com/technetwork/java/javase/downloads/index.html

JDK 12 新特性一览:

  • 189:Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)

    http://openjdk.java.net/jeps/189

  • 230:Microbenchmark Suite

    http://openjdk.java.net/jeps/230

  • 325:Switch Expressions (Preview)

    http://openjdk.java.net/jeps/325

  • 334:JVM Constants API

    http://openjdk.java.net/jeps/334

  • 340:One AArch64 Port, Not Two

    http://openjdk.java.net/jeps/340

  • 341:Default CDS Archives

    http://openjdk.java.net/jeps/341

  • 344:Abortable Mixed Collections for G1

    http://openjdk.java.net/jeps/344

  • 346:Promptly Return Unused Committed Memory from G1

    http://openjdk.java.net/jeps/346

首先值得关注的是 Switch Expressions,这是一个为开发者准备的特性,我们可以利用具体代码快速了解一下,下面是传统 statement 形式的 switch 语法:

switch (day) {
case MONDAY:
case FRIDAY:
case SUNDAY:
System.out.println(6);
break;
case TUESDAY:
System.out.println(7);
break;
case THURSDAY:
case SATURDAY:
System.out.println(8);
break;
case WEDNESDAY:
System.out.println(9);
break;
}

如果有编码经验,你一定知道,switch 语句如果漏写了一个 break,那么逻辑往往就跑偏了,这种方式既繁琐,又容易出错。如果换成 switch 表达式,Pattern Matching 机制能够自然地保证只有单一路径会被执行,请看下面的代码示例:

switch (day) {
case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);
case TUESDAY -> System.out.println(7);
case THURSDAY, SATURDAY -> System.out.println(8);
case WEDNESDAY -> System.out.println(9);
}

更进一步,下面的表达式,为我们提供了优雅地表达特定场合计算逻辑的方式

int numLetters = switch (day) {
case MONDAY, FRIDAY, SUNDAY -> 6;
case TUESDAY -> 7;
case THURSDAY, SATURDAY -> 8;
case WEDNESDAY -> 9;
};

Switch Expressions 或者说起相关的 Pattern Matching 特性,为我们提供了勾勒出了 Java 语法进化的一个趋势,将开发者从复杂繁琐的低层次抽象中逐渐解放出来,以更高层次更优雅的抽象,既降低代码量,又避免意外编程错误的出现,进而提高代码质量和开发效率。

第二,则是很有现实意义度 Shenandoah GC。它是 Redhat 主导开发的 Pauseless GC 实现,从大概 2013 年开始研发,终于取得了重要的阶段性成果,与其他 Pauseless GC 类似,Shenandoah GC 主要目标是 99.9% 的暂停小于 10ms,暂停与堆大小无关等。

也许了解 Shenandoah GC 的人比较少,业界声音比较响亮的是 Oracle 在 JDK11 中开源出来的 ZGC,或者商业版本的 Azul C4(Continuously Concurrent Compacting Collector)。但是,笔者认为,至少目前,其实际意义大于后两者,因为:

  • 使用 ZGC 的最低门槛是升级到 JDK11,对很多团队来说,这种版本的跳跃并不是非常低成本的事情,更何况是尚不清楚 ZGC 在自身业务场景中的实际表现如何。

  • 而 C4,毕竟是土豪们的选择,现实情况是,有多少公司连个几十块钱的 License 都不舍得…

  • 而 Shenandoah GC 可是有稳定的 JDK8u 版本发布的哦,据我所知已经有个别公司在 HBase 等高实时性产品中实践许久。

从原理的角度,我们可以参考该项目官方的示意图,其内存结构与 G1 非常相似,都是将内存划分为类似棋盘的 region。整体流程与 G1 也是比较相似的,最大的区别在于实现了并发的 Evacuation 环节,引入的 Brooks Forwarding Pointer 技术使得 GC 在移动对象时,对象引用仍然可以访问。

下面是 jbb15 benchmark 中,Shenandoah GC 相对于其他主流 GC 的表现,GC 暂停相比于 CMS 等选择有数量级程度的提高,对于 GC 暂停非常敏感的场景,价值还是很明显的,能够在 SLA 层面有显著提高。当然,这种对于低延迟的保证,也是以消耗 CPU 等计算资源为代价的,实际吞吐量表现也不是非常明朗,需要看企业的实际场景需求,并不是一个一劳永逸的解决方案。

其他的一些特性,例如,G1 相关的两个特性是对 G1 在特定场景不足的有效改进,但谈不上是突破性的提高,不再一一列举。

与 JDK11 这种长期支持版本(Long-Term-Support,LTS)相比,JDK12 似乎关注度有限,大家对于 JDK 这种频繁的节奏也有点麻木了,那么

  • JDK12 这种非 LTS 版本,是否有什么生产环境价值?

  • Java 新的发布模式是否达到了其快速落地和迭代新特性的目的?

也许不会有太多公司直接选择 JDK12,但个别的生产实践并不遥远。比如,我所在部门在实践场景中发现,利用 JDK 12 的 Abortable Mixed Collections for G1,解决了 HDFS 在特定场景中 G1 Evacuation 时间过长的困扰,虽然最后团队选择将其 backport 到了自己的 JDK11 版本中,但如果没有快速交付的预览版 JDK12,也不会如此快速的得到结论。

而对另一个问题,笔者认为目前看是非常成功的,解开了 Java/JVM 演进的许多枷锁,至关重要的是,OpenJDK 的权力中心,正在转移到开发社区和开发者手中。在新的模式中,既可以利用 LTS 满足企业长期可靠支持的需求,也可以满足各种开发者对于新特性迭代的诉求。你可能注意到了 Switch Expressions 被打上了预览(Preview)的标签,Shenandoah GC 则是实验(Experimental)特性,这些都是以往的发布周期下不大现实的,因为用 2-3 年的最小间隔粒度来实验一个特性,基本是不现实的。

可以预计,JDK8 在未来的一段时间仍将是主流,我们已经注意到 Amazon、Alibaba、Redhat、AdoptOpenJDK 等等厂商或社区,纷纷发布了自己的 JDK8 等产品,开始竞赛长期支持版本 JDK 的主导权,笔者认为这是非常好的迹象,反映了主流厂商对于 Java 的投资力度增大。

是否会带来 Java/JVM 的碎片化呢?多少会发生一些,但从目前的合作模式来看,OpenJDK 仍然是合作的中心,主导这 Java 历史版本维护和未来的演进路线。

一些小鲜肉语言嘲笑 Java,实现类似功能,Java 代码要多写近一倍,程序要笨重一个数量级,有些也许是言过其实,但语法的表达能力和 JVM 的庞大,确实逐渐成为 Java 发展的短板,JDK10~12 发布的不间断成功,让我们看到了 Java/JVM 大踏步前进的曙光!

作者介绍

杨晓峰,前 Oracle 首席工程师,极客时间专栏作者。

今日荐文

点击下方图片即可阅读

数据中台已成下一风口,它会颠覆数据工程师的工作吗?


QCon 全球软件开发大会(广州站)将邀请来自 Google、LinkedIn、BAT、华为、小米等国内外一线技术专家,涵盖 13+技术热点、70+话题,另有丰富的社交活动、一起聊聊技术圈那些事儿!

大会 8 折门票 限时限量抢购,感兴趣的同学抓紧时间向 Boss 申请报名,有任何问题请联系票务小姐姐鱼丸,电话:13269078023 (微信同)。扫描下方二维码 或点击 阅读原文,提前剧透!



点个在看少个 bug ?

相关文章

Go语言出现后,Java还是最佳选择吗?

2015-08-06
实际上Java程序有一个绕不过的库——JDK.Wisp就是在JDK里所有的阻塞调用出进行了非阻塞+事件恢复协程的方式支持了协程调度...

堕落 Java vs 新贵 Python,2018 年最应该学习哪一门编程语言?

2015-08-05
Java 的曲折之路千呼万唤始出来,在经历了多次跳票的 JDK 9 最终于 2017 年 9 月正式发布了,作为 Java 标准的最新实现,曾因为其...

神州云 | Java社区显现中国力量,神州数码楠竹OpenJDK正式发布

2015-08-04
而JDK作为Java语言的软件开发工具包,是整个Java应用开发的核心.近日,在2020神州数码合作伙伴创新峰会上,神州数码自有品...

java知识干货!教你如何在电脑上安装好一个jdk!

2015-08-03
配置变量一:JAVA_HOME(JDK安装的所在位置) 配置变量二:PATH(指向JDK安装路径下的bin目录) bin下为Java命令工具,配...

开发者报 | 高通指控苹果窃取商业机密;Java 11 / JDK 11 正式发布!

2015-08-03
5、Java 11 / JDK 11 正式发布!美国当地时间9月25日,Oracle 官方宣布 Java 11 (18.9 LTS) 正式发布,可在生产环境中使用!这是自 ...

Oracle 痛下杀手:Java 浏览器插件将在 JDK 9 上被彻底弃用

2015-08-03
Java Web插件将从计划于九月发布的JDK 9开始被弃用,然后在未来版本的JDK和JRE中被彻底移除(具体时间仍不确定).编译自:...

Java 11 将至,除了 Oracle JDK 还有这些版本!

2015-08-03
JDK或兼容 Java SE 规范的 JDK.还要注意,认证程序目前是基于信任基础的 —— 结果不会提交给 JCP/Oracle 用于检查,也不会被...

Java 老矣,尚能饭否?2020 Java生态系统报告出炉

2015-08-03
JRE/JDK版本、数据库、部署模型、构建工具和虚拟化工具等.... Java 8使用者最多58%的受访者表示,他们在主要应用程序中选择...

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

2015-08-03
Java JDK,也是最常用的一个,是 Oracle 公司(收购了开发 Java 的 Sun 公司)对 Java SE 的实现.如果更详细分的话,可以分为 ...

JDK 11 特性冻结!最全的 Java 11 API 变更提案一览

2015-08-03
JDK10.0.1JDK11ea14SystemarraycopyJDK10JDK11ea19setProperty(String, String)之前改变 java.home 会导致一些问题,现在问题已...

随机推荐

Web 建站技术中,HTML、HTML5、XHTML、CSS、SQL、JavaScript、PHP、ASP.NET、 是什么?

2020-08-14
别人会去猜测你说的到底是什么一样,有些时候前端程序猿不小心... PHP 就是一种常见的用来写服务器脚本的语言,其实只要是能拿...

在PHP开发中六种加密的方法,你用的是哪种?

2020-07-07
php 自带的加密函数 不可逆的加密函数为:md5()、crypt()md5() 用来计算 MD5 哈稀.语法为:string md5(string str);crypt() 将字符...

PhpStorm学习PHP开发1-PhpStorm 环境搭建

2020-06-02
PhpStorm工具是开发者比较好的选择之一.PhpStorm是JetBrains 公司开发的一款商业的 PHP 集成开发工具,旨在提高用户效率,可...

打造自己的弱口令扫描工具

2020-05-31
phpmyadmin 扫描模块模拟http请求,检测phpmyadmin弱口令.import requestsdef phpMyAdmin_login(ip,port,user,pwd): try: url = "http...

cron计划任务应用

2020-03-23
date命令用来按格式输出日期时间信息,%Y%m%d表示年月日++ ... php .data/dbcon.txt.. ..[zhsan@svr7 ~]$ chmod +x /home/zhsan/xx....

2020渗透测试面试问题大全

2020-02-05
27、服务器为IIS+PHP+MySQL,发现root权限注入漏洞,讲讲你的渗透思路可以读取IIS信息,知道路径,如果像WAMMP类似构建,...

【计算机组成原理】运算速度的性能指标

2015-06-09
22计算机考研交流总QQ群:1032995316课程咨询微信号|容嬷嬷(csky-rmm)强哥,CPU时钟到底是什么啊?又是时钟频率又是时钟...

【数据直播】最新皮棉加工量、入库量日报、全国棉花收购加工汇总

2015-03-14
皮棉加工量皮棉检验量新疆地区皮棉加工量详情内地地区皮棉加工量详情(单位:吨)全国棉花收购情况汇总新疆籽棉收购均价表内地...

大规模分类体系中的isA关系错误检测图算法 | 阅读小组 #03

2015-02-05
阅读小组第二期,我们一起精读的文章是机器翻译方向的A Character-Level Decoder without Explicit Segmentation for Neural Machine ...

2022北京冬奥会图标融入书法篆刻!彰显大国文化自信!

2015-01-05
北京2022冬季奥运会体育图标正式公布近日,北京2022年冬奥会和冬残奥会的体育图标终于正式发布!体育图标的设计是每一届冬夏...