终于,期待已久的 Java 9 正式发布了!

java-9.jpeg

经过4次跳票,历经曲折的 Java 9 正式版终于发布了! 我们以通过Oracle的官网(http://www.oracle.com/technetw … .html)下载 Java 9 正式版。
JDK9 提供超过 150 项新功能特性,包括备受期待的模块化系统、可交互的 REPL 工具 jshell,以及安全增强、扩展提升、性能管理改善等。

Java9可以说是一个庞大的系统工程。Java 的方方面面,包括 JDK 编译工具,运行时,Java 公共 API 和私有代码等等,完全做了一个整体改变。

随着 Java 平台模块化系统的落地,开发人员无需再为不断膨胀的 Java 平台苦恼,例如,您可以使用 jlink 工具,根据需要定制运行时环境。这对于拥有大量镜像的容器应用场景或复杂依赖关系的大型应用等,都具有非常重要的意义。

从软件开发实践的角度,Java 语言层面提供对模块的支持,可以鼓励(当然在某种程度上也可以看作强制)更加规范的开发实践,利用业界在开发领域几十年的经验、教训总结出的最佳实践,促进 Java 生态的健康发展。比如,更加完善的隐藏实现细节,这不仅可以促进面向接口、约定的编程,也可以避免可能的安全风险等。

不过,换个角度来说,天下没有免费的午餐,由于 JPMS 是语言平台层面的支持,它并不是完全透明的,也就是说不管用户是否真的需要或从中收益,都会或多或少的受其影响。

对此,我们可以从 JPMS 评审中针对类似深度反射限制之类的激烈争吵中,深刻体会到。比如,针对反射访问控制,最终 Java 9 开发团队,采取了相对折中的办法,在反射领域默认保持 Java 8 的默认行为。Java 9 在兼容性方面,相比于过往的版本,采取了更大的容忍度。
不过,Java 9 的相当一部分特性仍然是对用户透明的。只要升级到 Java 9,不需要或者很少需要用户参与动作就能获益。比如,更加紧凑的字符串实现;改进的竞争锁机制;改进安全应用性能 ;利用特定 CPU 指令优化 GHASH 和 RSA 等等,这些都是开箱即用、触手可得的改进。

Java 9 值得关注的新特性

对于部分开发者来说,探究 Java 内部 API 或者平台底层能力是一件非常酷的事情,但这往往并不是非常容易,比如部分能力可能并没有在历史版本的公共 API 中暴露出来(比如 Unsafe 相关),或者需要特定领域的知识。在 Java 9 中,不要错过 JEP 193: Variable Handles 和 JEP 274: Enhanced Method Handles,JEP 259: Stack-Walking API,JEP 285: Spin-Wait Hints 等特性。

另外,Java 9 中还有很多承上启下的特性,为未来创新打下基础或者整合、规范现有碎片化的功能,我会介绍一些有代表性的新特性。
在 Java 虚拟机领域,JEP 271: Unified GC Logging 和 JEP 158:Unified JVM Logging,对各种 JVM 日志进行了统一,大家终于不用为各种碎片化的日志选项苦恼了。

Oracle 一直在努力提高 Java 启动和运行时性能,希望其能够在更广泛的场景达到或接近本地语言的性能。但是,直到今天,谈到 Java,很多 C/C++ 开发者还是会不屑地评价为启动慢,吃内存。

简单说,这主要是因为 Java 编译产生的类文件是 Java 虚拟机可以理解的二进制代码,而不是真正的可执行的本地代码,需要 Java 虚拟机进行解释和编译,这带来了额外的开销。

JIT(Just-in-time)编译器可以在运行时将热点编译成本地代码,但是实际应用可能非常庞大,大型 Java 应用的预热往往非常耗时,而且非热点代码可能根本没有机会被 JIT 编译。

在 JDK 9 中, AOT(JEP 295: Ahead-of-Time Compilation)作为实验特性被引入进来,开发者可以利用新的 jaotc 工具将重点代码转换成类似类库一样的文件,这样会大大降低启动开销。

另外 JVMCI (JEP 243: Java-Level JVM Compiler Interface)等特性,对于整个编程语言的发展,可能都具有非常重要的意义,虽然未必引起了广泛关注。目前 Graal Core API 已经被集成进入 Java 9,虽然还只是初始一小步,但是完全用 Java 语言来实现的可靠的、高性能的动态编译器,似乎不再是遥不可及,这是 Java 虚拟机开发工程师的福音。

与此同时,随着 Truffle 框架和 Substrate VM 的发展,已经让个别信心满满的工程师高呼“One VM to Rule Them All!”, 也许就在不远的将来 Ploygot 以一种另类的方式成为现实。

Java 的未来

前面简短地谈了谈 Java 9 中的一些令人激动的特性,Java 9 在取得这些进步的同时,那么在其的研发过程中有哪些教训,当前和未来遇到了那些挑战呢?

首先,就是如何更加快速、敏捷地进行创新。在 Java 9 的开发过程中, 非常突出的一点就是,由于 Jigsaw 项目的延期,导致 Java 9 的发布一再推迟,这带来了很多负面影响。大批特性已经完成多时,却无法及时被实际应用采纳,开发者无法及时地从中获益,也很难尽早发现和反馈可能存在的问题或改进。这不禁让人反思 Java 传统的研发模式的局限性。

针对这些情况,Java 首席架构师 Mark Reinhold 已经发出倡议,建议从传统的以特性驱动的发布周期,转变为以时间驱动的(6 个月为周期)发布模式,并逐步的将 Oracle JDK 原有商业特性进行开源,Java Flight Recorder 等杀手级工具和特性,一定会大受开发者的欢迎。针对企业客户的需求,Oracle 将以三年为周期发布长期支持版本(long term support)。

第二,随着云计算和 AI 等技术浪潮,当前的计算模式和场景正在发生翻天覆地的变化,不仅对 Java 的发展速度提出了更高要求,也深刻影响着 Java 技术的发展方向。传统的大型企业或互联网应用,正在被云端,容器化应用、模块化的微服务甚至是函数(FaaS, Function-as-a-Service)所替代。

Java 需要在新的计算场景下,改进开发效率。这话说的有点笼统,我谈一些自己的体会,Java 代码虽然进行了一些类型推断等改进,更易用的集合 API 等,但仍然给开发者留下了过于刻板、形式主义的印象,这是一个长期的改进方向,例如,JEP 286: Local-Variable Type Inference;持续改进并发计算框架,Java 的并发特性非常强大和系统,但某种程度上过于复杂,在今年的 JVMLS 上,阿里巴巴 AJDK 组介绍了利用协程改进并发的实践,这是一个令人眼前一亮的创新;Java 非常需要更加友好的本地代码支持,相关的特性有很多好的想法和尝试,比如 Panama 项目;Value Types 和改进的泛型,有兴趣可以参考 Valhalla 项目。

最后,进一步改进启动和运行性能、优化计算资源使用。目前,相当一部分的 Java 类库和虚拟机特性都是针对长时间、大数据量、高并发等复杂任务进行的优化,但是在部分云计算场景中,比如越来越引起大家关注的 FaaS 应用,短时间、无状态的函数正在成为常见的计算单元。那么在这种场景下,Java 必须进行相应的改进和创新,才能保持和强化目前在软件开发领域的竞争力。比如,提高 Java 运行时启动速度,尤其是在容器环境的初始化表现;保证 CPU 等计算资源调度能力能够适应容器环境的新情况,最直接的就是 Java 平台需要支持基于 cgroup 等技术的资源管理;针对新场景下的 GC 优化;如何提高数据密度和计算效率等等。

以上很多方面往往不是孤立的,也不是非常简单就可以完成的,很多改进都是依赖于相关语言基础技术的进步和突破,Java 的进步需要持之以恒的耐心和持续的努力与投入。

最后,欢迎大家能够参与到 OpenJDK 社区,Java 是大家的,欢迎您向 OpenJDK 提供建议、意见或者直接提交自己的改进,在社区中听见越来越多的来自中国的声音是非常令人高兴的事情,让我们携手促进 Java 的创新和发展。

同时发布的还有 Java EE 8 (http://www.oracle.com/technetw … .html
/uploads/fox/23085908_0.jpeg
相关链接

Installation Instructions:http://docs.oracle.com/javase/ … .html

Release Notes:http://www.oracle.com/technetw … .html

What’s New in Oracle JDK 9:https://docs.oracle.com/javase … 681F6

Release Notes for JDK 9 and JDK 9 Update Releases:http://www.oracle.com/technetw … .html

Readme:http://www.oracle.com/technetw … .html
 其他链接
 

    附上 JDK 9 特性一览
    102: Process API 更新
    110: HTTP 2 Client
    143: 提升访问对象时的线程竞争处理
    158: 统一 JVM 日志
    165: Compiler Control
    193: Variable Handles
    197: 分割代码缓存区
    199: Smart Java Compilation, 第二阶段
    200: 模块化JDK
    201: 模块化源码
    211: Elide Deprecation Warnings on Import Statements
    212: Resolve Lint and Doclint Warnings
    213: Milling Project Coin
    214: Remove GC Combinations Deprecated in JDK 8
    215: Tiered Attribution for javac
    216: Process Import Statements Correctly
    217: Annotations Pipeline 2.0
    219: Datagram Transport Layer Security (DTLS)
    220: 模块化运行时镜像
    221: Simplified Doclet API
    222: jshell: The Java Shell (Read-Eval-Print Loop)
    223: New Version-String Scheme
    224: HTML5 Javadoc
    225: Javadoc Search
    226: UTF-8 Property Files
    227: Unicode 7.0
    228: Add More Diagnostic Commands
    229: Create PKCS12 Keystores by Default
    231: Remove Launch-Time JRE Version Selection
    232: Improve Secure Application Performance
    233: Generate Run-Time Compiler Tests Automatically
    235: Test Class-File Attributes Generated by javac
    236: Parser API for Nashorn
    237: Linux/AArch64 Port
    238: Multi-Release JAR Files
    240: Remove the JVM TI hprof Agent
    241: Remove the jhat Tool
    243: Java-Level JVM Compiler Interface
    244: TLS Application-Layer Protocol Negotiation Extension
    245: Validate JVM Command-Line Flag Arguments
    246: Leverage CPU Instructions for GHASH and RSA
    247: Compile for Older Platform Versions
    248: Make G1 the Default Garbage Collector
    249: OCSP Stapling for TLS
    250: Store Interned Strings in CDS Archives
    251: Multi-Resolution Images
    252: Use CLDR Locale Data by Default
    253: Prepare JavaFX UI Controls & CSS APIs for Modularization
    254: Compact Strings
    255: Merge Selected Xerces 2.11.0 Updates into JAXP
    256: BeanInfo Annotations
    257: Update JavaFX/Media to Newer Version of GStreamer
    258: HarfBuzz Font-Layout Engine
    259: Stack-Walking API
    260: Encapsulate Most Internal APIs
    261: 模块化系统
    262: TIFF Image I/O
    263: HiDPI Graphics on Windows and Linux
    264: Platform Logging API and Service
    265: Marlin Graphics Renderer
    266: More Concurrency Updates
    267: Unicode 8.0
    268: XML Catalogs
    269: Convenience Factory Methods for Collections
    270: Reserved Stack Areas for Critical Sections
    271: Unified GC Logging
    272: Platform-Specific Desktop Features
    273: DRBG-Based SecureRandom Implementations
    274: Enhanced Method Handles
    275: Modular Java Application Packaging
    276: Dynamic Linking of Language-Defined Object Models
    277: Enhanced Deprecation
    278: Additional Tests for Humongous Objects in G1
    279: Improve Test-Failure Troubleshooting
    280: Indify String Concatenation
    281: HotSpot C++ Unit-Test Framework
    282: jlink: The Java Linker
    283: Enable GTK 3 on Linux
    284: New HotSpot Build System
    285: Spin-Wait Hints
    287: SHA-3 Hash Algorithms
    288: Disable SHA-1 Certificates
    289: Deprecate the Applet API
    290: Filter Incoming Serialization Data
    291: Deprecate the Concurrent Mark Sweep (CMS) Garbage Collector
    292: Implement Selected ECMA 6 Features in Nashorn
    294: Linux/s390x Port
    295: Ahead-of-Time Compilation
    297: Unified arm32/arm64 Port
    298: Remove Demos and Samples
    299: Reorganize Documentation
     

    21CTO社区综合于网络。

    原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/256785.html

    (0)
    上一篇 2022年5月19日
    下一篇 2022年5月19日

    相关推荐

    发表回复

    登录后才能评论