《架构师》2018年10月
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

Java 11正式发布,新特性解读

作者 杨晓峰

北京时间9月26日,Oracle官方宣布Java 11正式发布。这是Java大版本周期变化后的第一个长期支持版本,非常值得关注。你可以点击这里下载。

最新发布的Java11将带来ZGC、Http Client等重要特性,一共包含17个JEP(JDK Enhancement Proposals, JDK增强提案)。

除了这些重要特性以外,Java 11还有哪些值得关注的点呢?Java现在更新那么频繁,是否要考虑升级呢?工程师们还应该继续学,学得动吗?一起来看!

不知不觉JDK 11已经发布了,从9开始,JDK进入了让人学不动的更新节奏,对于广大Java工程师来说,真是又爱又恨,Java演进快速意味着它仍将能够保持企业核心技术平台的地位,我们对Java的投入和饭碗是安全的,但同时也带来了学习、选择的困惑。

所以,今天我们不准备做个流水账的介绍,一起来看看工程师甚至是IT决策者最关心的问题:

· JDK更新如此频繁,我是否要考虑升级?新的发布模式下,企业的IT策略需要做出什么样的调整?

· 除了耍酷,JDK 11,或者说最近的JDK版本,有什么真正值得生产环境中应用的特性?工程师要跟进吗?

对于第一个问题,本人十分确信JDK 11将是一个企业不可忽视的版本。

首先,从时间节点来看,JDK 11的发布正好处在JDK 8免费更新到期的前夕,同时JDK 9、10也陆续成为“历史版本”,请看下面的Oracle JDK支持路线图。

JDK更新很重要吗?非常重要,在过去的很多年中,Oracle和OpenJDK社区提供了接近免费的午餐,导致人们忽略了其背后的海量工作和价值,这其中包括但不仅仅限于:

最新的安全更新,如,安全协议等基础设施的升级和维护,安全漏洞的及时修补,这是Java成为企业核心设施的基础之一。安全专家清楚,即使开发后台服务,而不是前端可直接接触,编程语言的安全性仍然是重中之重。

大量的新特性、Bug修复,例如,容器环境支持,GC等基础领域的增强。很多生产开发中的Hack,其实升级JDK就能解决了。

不断改进的JVM,提供接近零成本的性能优化。

“Easy is cheap”? Java的进步虽然“容易”获得,但莫忽略其价值,这得益于厂商和OpenJDK社区背后的默默付出。

第二,JDK 11是一个长期支持版本(LTS, Long-Term-Support)。

对于企业来说,选择11将意味着长期的、可靠的、可预测的技术路线图。有人说,那是对于付费订阅客户,不订阅是不是就不用考虑11了呢?

不,请放心,11确定将得到OpenJDK社区的长期支持,目前Oracle提供了OpenJDK build,虽然后续计划未定,但是承诺“至少维护到明年”。即使是停止发布后续JDK11更新,Andrew Haley等社区专家也已经明确保证,会组建并领导“JDK-11-updates”项目,并且保证:

“please let me assure you of one thing: whether by Oracle orRed Hat or someone else, JDK LTS releases will continue to be supported. We all have a lot invested in Java, and we won't let itfall.”

所以,LTS版本将是企业IT决策者可以放心选择的版本。

回到第二个问题,我们一起来看看JDK 11的有哪些能力上的突破,能够让我们觉得升级到JDK 11是超值的。

从JVM GC的角度,JDK 11引入了两种新的GC,其中包括也许是划时代意义的ZGC,虽然其目前还是实验特性,但是从能力上来看,这是OpenJDK的一个巨大突破,为特定生产环境的苛刻需求提供了一个可能的选择。例如,对部分企业核心存储等产品,如果能够保证不超过10ms的GC暂停,可靠性会上一个大的台阶,这是过去我们进行GC调优几乎做不到的,是能与不能的问题。相信你对下面的数据已经不再陌生。

关于ZGC特性的解读已经非常多,本文不再重复。我在这里主要介绍那些不起眼,但更具生产系统价值的部分。例如,对于G1 GC,相比于JDK 8,升级到JDK 11即可免费享受到:并行的Full GC,快速的CardTable扫描,自适应的堆占用比例调整(IHOP),在并发标记阶段的类型卸载等等。这些都是针对G1的不断增强,其中串行Full GC等甚至是曾经被广泛诟病的短板,你会发现GC配置和调优在JDK11中越来越方便。

云计算时代的监控、诊断和Profiling能力,这是个人认为比ZGC更具生产实践意义的特性。

不知道你有没有注意到,不知不觉中Java的应用场景发生了天翻地覆的变化,从单机长时间运行的Java应用,发展成为分布式、大的单体应用或小的function、瞬时或长时间运行等,应用场景非常复杂。

我们还用什么工具诊断Java应用?JConsole, JProfiler,还是“自研”的各种工具?目前的工具大多是从对单个Java应用的诊断视角出发,试想如果我们的集群中有几百、数千台机器或容器,每台机器有几个或者几十个Java进程,那么:

怎么在不干扰生产系统的情况下,高效地跟踪海量的Java进程,准确定位可以优化的性能空间?

如何保证“随机出现”的JVM问题,不需要进行额外的、令人头痛的“重现”?

JDK 11悄悄地为我们提供了更加强大的基础能力,主要是两部分:

JEP 328: Flight Recorder(JFR)是Oracle刚刚开源的强大特性。我们知道在生产系统进行不同角度的Profiling,有各种工具、框架,但是能力范围、可靠性、开销等,大都差强人意,要么能力不全面,要么开销太大,甚至不可靠可能导致Java应用进程宕机。

而JFR是一套集成进入JDK、JVM内部的事件机制框架,通过良好架构和设计的框架,硬件层面的极致优化,生产环境的广泛验证,它可以做到极致的可靠和低开销。在SPECjbb2015等基准测试中,JFR的性能开销最大不超过1%,所以,工程师可以基本没有心理负担地在大规模分布式的生产系统使用,这意味着,我们既可以随时主动开启JFR进行特定诊断,也可以让系统长期运行JFR,用以在复杂环境中进行“After-the-fact”分析。还需要苦恼重现随机问题吗?JFR让问题简化了很多哦。

在保证低开销的基础上,JFR提供的能力也令人眼前一亮,例如:

我们无需BCI就可以进行Object Allocation Profiling,终于不用担心BTrace之类把进程搞挂了。

· 对锁竞争、阻塞、延迟,JVM GC、SafePoint等领域,进行非常细粒度分析。

· 甚至深入JIT Compiler内部,全面把握热点方法、内联、逆优化等等。

· JFR提供了标准的Java、C++ 等扩展API,可以与各种层面的应用进行定制、集成,为复杂的企业应用栈或者复杂的分布式应用,提供All-in-One解决方案。

而这一切都是内建在JDK和JVM内部的,并不需要额外的依赖,开箱即用。

另一方面,就是同样不起眼的JEP 331: Low-Overhead Heap Profiling。我们知道,高效地了解在Java堆上都进行了哪些对象分配,是诊断内存问题的基本出发点之一。 JEP 331来源于Google等业界前沿厂商的一线实践,通过获取对象分配的Call-site,为JDK补足了对象分配诊断方面的一些短板,工程师可以通过JVMTI使用这个能力增强自身的工具。

从Java类库发展的角度来看,JDK 11最大的进步也是两个方面:

首先,是难得的现代HTTP/2 Client API, Java工程师终于可以摆脱老旧的HttpURLConnection了。新的HTTP API提供了对HTTP/2等业界前沿标准的支持,精简而又友好的API接口,与主流开源API(如,Apache HttpClient, Jetty, OkHttp等)对等甚至更高的性能。与此同时它是JDK在Reactive-Stream方面的第一个生产实践,广泛使用了Java Flow API等,终于让Java标准HTTP类库在扩展能力等方面,满足了现代互联网的需求。

第二,就是安全类库、标准等方面的大范围升级,其中特别是JEP 332: Transport Layer Security(TLS)1.3,除了在安全领域的重要价值,它还是中国安全专家范学雷所领导的JDK项目,完全不同于以往的修修补补,是个非常大规模的工程。

除此之外,JDK还在逐渐进行瘦身工作,或者偿还JVM、Java规范等历史欠账,例如

· 181: Nest-Based Access Control

· 309: Dynamic Class-File Constants

· 320: Remove the Java EE and CORBA Modules

· 330: Launch Single-File Source-Code Programs

· 335: Deprecate the Nashorn JavaScript Engine

· 336: Deprecate the Pack200 Tools and API

其中最值得关注的是JEP 335,它进一步明确了Graal很有可能将成为JVM向前演进的核心选择,Java-on-Java正在一步步的成为现实。

JDK 11还有什么遗憾吗?很多Valhalla、Loom、Panama等项目中继续补齐的短板,如协程、Value Type等,目前还是可望而不可即,也许令人欣慰地是,我们能看到Java能够正视自身存在的不足,不断飞速发展。

从1995年第一个版本发布到现在,Java语言已经在跌宕起伏中走过了23年。这23年,既有Java连续霸榜多年的风头无两,也有近两年Java不可忽视的颓势。Java是最好的语言吗?不是,每个领域都有更合适的编程语言,没有无所不能的存在。

Java语言到底有什么优势可以占据排行榜第一的位置呢?

其一,语法比较简单,学过计算机编程的开发者都能快速上手,JVM也为开发者屏蔽了大量复杂的细节。其二,能力过硬,在若干个领域的竞争力都非常强,比如服务端编程,高性能网络程序,企业软件事务处理,大数据,分布式计算,移动、嵌入终端应用开发等等。最重要的一点是其吸收了了业界领先的工程实践,构建从嵌入式设备到超大规模软件系统的能力,充分得到了实践验证。所有这些都使得Java成为企业软件公司的首选,也得到很多互联网公司的青睐。时移世易,Java正在也必须改变。

Java改为每半年发版一次以后,在对合并关键特性、快速得到开发者反馈等方面,做得越来越好,我们明显能够看到各厂商和社区对Java投入的提高。最新发布的JDK 11虽然谈不上划时代的进步,但一定是JDK发展历程中的一个重要版本,升级JDK就可以获得的性能等各种提高,基础能力的全面进步和突破,这一切无不说明,是时候开始评估并开始计划升级到JDK 11了。