前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JDK11介绍

JDK11介绍

作者头像
潇洒
发布2023-10-20 12:47:04
3160
发布2023-10-20 12:47:04
举报
文章被收录于专栏:石头岛

JDK 11 特性

做为java开发JDK的更新内容是必须要关注的,这里我把JDK11的相关的JEP(JDK Enhancement Proposals),汇总并偿试了一下。 分享一下相关的改进点。 历史所有JEP:http://openjdk.java.net/jeps/0

JDK11发版 JEP 汇总

JDK11 于2018年9月25日发布正式版,其中官方给出的改进JEP如下:

JEP-181 嵌套类可见性控制 JEP-309 动态类文件常量 JEP-315 改进 Aarch64 Intrinsics JEP-318 Epsilon–一个无操作的垃圾收集器 JEP-320 删除 Java EE 和 CORBA 模块 JEP-321 HttpClient JEP-323 用于 Lambda 参数的局部变量语法 JEP-324 Curve25519 和 Curve448 算法的密钥协议 JEP-327 Unicode 10 JEP-328 Flight Recorder(飞行记录器) JEP-329 haCha20 和 Poly1305 加密算法支持 JEP-330 Launch Single-File Source-Code Programs(启动单一文件的源代码程序) JEP-331 低开销的 Heap Profiling JEP-332 TLS 1.3支持 JEP-333 ZGC: A Scalable Low-Latency Garbage Collector(可伸缩低延迟垃圾收集器) JEP-335 弃用 Nashorn JavaScript 引擎 JEP-336 弃用 Pack200 工具和 API

有些泛及底层有些泛及开发的方方面面,后面对这些特性进行逐说明,以及使用JDK11开发我们需要注意的事项。

JEP-181 嵌套类可见性控制

这一提案是为了增强自Java 1.1即引入的嵌套类设计。 嵌套类主要有两个用处。 第一是因为其只使用于很短的代码块中,在Java8之前,这主要依靠实现一个匿名类来完成。Java8之后,这种用法可以被lambda表达取代。 另一种用法是因为需要访问另一个类的内部。嵌套类具有和成员变量以及成员方法相同的访问权限。 JEP181主要是为了解决JVM级别的权限与源码权限不一致的问题。

代码语言:javascript
复制
public class JEP181 {

    public static class Nest1 {
        private int varNest1;
        public void f() throws Exception {
            final Nest2 nest2 = new Nest2();
            //这里没问题
            nest2.varNest2 = 2;
            final Field f2 = Nest2.class.getDeclaredField("varNest2");
            //这里在java8环境下会报错,在java11中是没问题的
            f2.setInt(nest2, 2);
            System.out.println(nest2.varNest2);
        }
    }

    public static class Nest2 {
        private int varNest2;
    }

    public static void main(String[] args) throws Exception {
        new Nest1().f();
    }
}

运行结果 java11: 2

Java8:

Exception in thread "main" java.lang.IllegalAccessException: Class JEP181

主要问题出在f2.setInt(nest2,2),这里由于在Nest2中是private的,所以无法直接set值。但是却又可以直接调用nest2.var2=2来设置该值,因为嵌套类是可以访问别的嵌套类的私有属性的。Java 11修复了这个令人困惑的现象。

JEP-309 动态文件常量

这其实是一个联动一个比较早的改近。Java SE 7 已将 invokedynamic 引入了其指令集。Java 开发人员通常不会注意到此功能,它隐藏在 Java 字节码中。 Java的类型文件格式将被拓展,支持一种新的常量池格式:CONSTANT_Dynamic,加载CONSTANT_Dynamic会将创建委托给bootstrap方法。

目标: 其目标是降低开发新形式的可实现类文件约束带来的成本和干扰。

JEP-315 改进 Aarch64 Intrinsics

优化了现有的字符串和数组内部函数,并在Arm64Aarch64处理器上为Math.sin() ,**Math.cos()Match.log()**实现了新的内部函数。这意味着更好的性能。

内部函数用于利用特定于CPU体系结构的汇编代码来提高性能。

JEP-318 Epsilon–一个无操作的垃圾收集器

开发一个处理内存分配但不实现任何实际内存回收机制的 GC。 一旦可用的 Java 堆耗尽,JVM 将关闭。

它为以下内容分配内存:

性能测试。 内存压力测试。 VM 接口测试。 寿命极短的工作。 最后一滴延迟改进。(Last-drop latency improvements.) 最终吞吐量提高。 现在,Elipson 仅适用于测试环境。这将导致生产中的 OutOfMemoryError 并使应用程序崩溃。 Elipson 的好处是没有内存清除开销。因此,它将给出准确的性能测试结果,我们不再可以通过 GC 来停止它。

注意:这是一项实验性功能。

JEP-320 删除 Java EE 和 CORBA 模块

Java 9 中已经弃用了这些模块,现在将它们完全删除。 这个的话,主要还是Spring 的原因。JavaEE 比较重,开发配置特别繁锁,Spring的轻量化是事实的标准,更加简单的使用,导致像 EJB 这种重型框架没有市场,删除是必然的。

下面的包被删除:

java.xml.ws,java.xml.bind,java.activation,java.xml.ws.annotation,java.corba,java.transaction,java.se.ee,jdk.xml.ws,jdk.xml.bind

JEP 321 HttpClient

Java 11 标准化了 Http CLient API。其实就是重写了 HttpClient 内部逻辑 ,接口没变。

目前版本已经支持HTTP1.1、HTTP2、websocket等常用的基于http的协议,并支持了了同步、异步、响应式等交互方式。当前版本的实现还是比较简单,没有对于常用restful、content-type的封装支持。

JEP-323 用于 Lambda 参数的局部变量语法

这个算是一堆 JEP 中唯一在语法特性的改进。 Java 10 中引入了局部变量类型推断 var,示例:

代码语言:javascript
复制
var list = new ArrayList<String>();

java10中需要显示的声明 var 在 lambda 中的定义

代码语言:javascript
复制
List<String> list = Arrays.asList("嗯哼", "啊哈", "哦吼");
String result = list.stream()
        .map((var x) -> x.toUpperCase())
        .collect(Collectors.joining(","));
System.out.println(result2);

JEP 323 允许 var 用于声明隐式类型的 Lambda 表达式的形式参数,Java8 中也是允许在,只是在Java10中删除了这个特性,Java11中又把这个特性拿回来了:

代码语言:javascript
复制
List<String> list = Arrays.asList("嗯哼", "啊哈", "哦吼");
String result = list.stream()
        .map(x -> x.toUpperCase())
        .collect(Collectors.joining(","));

JEP-324 Curve25519 和 Curve448 算法的密钥协议

密码学相关项目,它将现有的椭圆曲线Diffie-Hellman(ECDH)方案替换为Curve25519Curve448算法,这是RFC 7748中定义的关键协议方案。

GenerateKeyPairs.java

代码语言:javascript
复制
package com.mkyong.java11.jep324;

import java.nio.charset.StandardCharsets;
import java.security.*;
import java.security.spec.NamedParameterSpec;

public class GenerateKeyPairs {

    public static void main(String[] args) throws NoSuchAlgorithmException, InvalidAlgorithmParameterException {
        KeyPairGenerator kpg = KeyPairGenerator.getInstance("XDH");
        NamedParameterSpec paramSpec = new NamedParameterSpec("X25519");
        kpg.initialize(paramSpec); 
        // equivalent to kpg.initialize(255)
        // alternatively: kpg = KeyPairGenerator.getInstance("X25519")
        KeyPair kp = kpg.generateKeyPair();
        System.out.println("--- Public Key ---");
        PublicKey publicKey = kp.getPublic();
        System.out.println(publicKey.getAlgorithm());   // XDH
        System.out.println(publicKey.getFormat());      // X.509

        // save this public key
        byte[] pubKey = publicKey.getEncoded();

        System.out.println("---");
        System.out.println("--- Private Key ---");
        PrivateKey privateKey = kp.getPrivate(); 
        System.out.println(privateKey.getAlgorithm());  // XDH
        System.out.println(privateKey.getFormat());     // PKCS#8

        // save this private key
        byte[] priKey = privateKey.getEncoded();
    }
}

结果:

代码语言:javascript
复制
--- Public Key ---
XDH
X.509
---
--- Private Key ---
XDH
PKCS#8
[B@42e26948

进一步阅读 有关更多示例,请参考JEP 324和Oracle – Java安全标准算法名称。

JEP-327 Unicode 10

Unicode 10.0增加了8,518个字符,总共136,690个字符。这些增加包括4个新脚本,总共139个脚本,以及56个新表情符号字符。

看看效果:

代码语言:javascript
复制
public class PrintUnicode {

    public static void main(String[] args) {
        String codepoint = "U+1F92A";
        System.out.println(convertCodePoints(codepoint));
    }

    // Java, UTF-16
    // Convert code point to unicode
    static char[] convertCodePoints(String codePoint) {
        Integer i = Integer.valueOf(codePoint.substring(2), 16);
        char[] chars = Character.toChars(i);
        return chars;

    }
}

结果: 🤪

JEP-328 Flight Recorder(飞行记录器)

Flight Recorder 以前是 Oracle JDK 中的商业附加组件,现已开放源代码。

JFR 是一种分析工具,用于从正在运行的 Java 应用程序中收集诊断信息和分析数据。它的性能开销可以忽略不计,通常低于 1%。因此,它可以用于生产应用。

默认情况下,JVM 禁用了 JFR,要启动 JFR,必须使用 -XX:+FlightRecorder 选项启动。例如,我们要启动名为 MyApp 的应用程序:

代码语言:javascript
复制
java -XX:+ UnlockCommercialFeatures -XX:+ FlightRecorder MyApp

JEP-329 chaCha20 和 Poly1305 加密算法支持

Java 11 提供了 ChaCha20 和 ChaCha20-Poly1305 密码实现。这些算法将在 SunJCE 提供程序中实现。 实现 RFC 7539 中指定的 ChaCha20 和 ChaCha20-Poly1305 密码。ChaCha20 是一种相对较新的流密码,可以替代旧的、不安全的 RC4 流密码。

chacha20-Poly1305是Google所采用的一种新式加密算法,性能强大,在CPU为的ARM平台上尤为显著(ARM v8前效果较明显),在同等配置的手机中表现是AES的4倍(ARM v8之后加入了AES指令,所以在这些平台上的设备,AES方式反而比chacha20-Poly1305方式更快,性能更好),可减少加密解密所产生的数据量进而可以改善用户体验,减少等待时间,节省电池寿命等。

JPE330 启动单一文件的源代码程序

这个功能初学阶比较有用,不必再关心先javajavac 这样的两步操作:

代码语言:javascript
复制
public class HelloWorld {
    public static void main(String[] args) {
    System.out.println("Hello World!");
   }
}

直接运行:

Java HelloWorld.java

JEP-331 低开销的 Heap Profiling

Java 虚拟机工具接口(JVM TI)是在 Java SE 5 引入的,它可以监控 JVM 内部事件的执行,也可以控制 JVM 的某些行为,可以实现调试、监控、线程分析、覆盖率分析工具等。

该 JEP 在 JVM TI 中添加了新的低开销的堆分析 API。

JEP-332 TLS 1.3支持

TLS: 传输层安全性

Java 11 支持 RFC 8446 传输层安全性(TLS)1.3协议。但是,并非所有TLS 1.3功能都已实现,有关详细信息。

Java 安全套接字扩展(JSSE)+ TLS 1.3 示例:

代码语言:javascript
复制
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
 
SSLSocketFactory factory = (SSLSocketFactory) SSLSocketFactory.getDefault();
socket = (SSLSocket) factory.createSocket("google.com", 443);
 
socket.setEnabledProtocols(new String[]{"TLSv1.3"});
socket.setEnabledCipherSuites(new String[]{"TLS_AES_128_GCM_SHA256"});

JEP 335: 弃用 Nashorn JavaScript 引擎

Nashorn JavaScript脚本引擎和jjs工具已被弃用,将来的发行版中可能会删除它。 ECMAScript的语言结构变化太快,Oracle发现,维护Nashorn JavaScript引擎变得非常困难。

Nashorn最初是在JDK 8(JEP174中引入)中引入的,用于取代Rhino脚本引擎(java1.6引入的脚本引擎)。当其发布时,Nashorn是ECMAScript-262 5.1的完整实现,增强了Java和JavaScript的兼容性。最近还增加了新的ECMAScript 6(ES6)特性。借助Nashorn,开发人员可以从JavaScript调用Java代码,也可以从Java代码调用JavaScript函数。Nashorn可以作为Java应用程序的嵌入式解释器,提供使用Nashorn命令行工具jjs从命令行运行JavaScript的能力。

JEP 336: 弃用 Pack200、unpack200 工具和 API

不推荐 pack200 和 unpack200 工具以及软件包中的 Pack200 API java.util.jar,并且可能会在将来的版本中删除。 Java 14 JEP 367 中删除了 Pack200 工具和 API 。

Pack200,这个工具能对普通的jar文件进行高效压缩。其实现原理是根据Java类特有的结构,合并常数池,去掉无用信息等来实现对java类的高效压缩。 由于是专门对Java类进行压缩的,所以对普通文件的压缩和普通压缩软件没有什么两样,但是对于Jar 文件却能轻易达到10-40%的压缩率。 这在Java应用部署中很有用,尤其对于移动Java计算,能够大大减小代码下载量。

废弃的原因:

  • Java 9 中引入了新的压缩方案 JMOD
  • Pack200 本身复杂,维护复杂

总结

大至上就是这么多了,小伙伴们可以自行动手玩一把。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-03-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • JDK 11 特性
    • JDK11发版 JEP 汇总
      • JEP-181 嵌套类可见性控制
        • JEP-309 动态文件常量
          • JEP-315 改进 Aarch64 Intrinsics
            • JEP-318 Epsilon–一个无操作的垃圾收集器
              • JEP-320 删除 Java EE 和 CORBA 模块
                • JEP 321 HttpClient
                  • JEP-323 用于 Lambda 参数的局部变量语法
                    • JEP-324 Curve25519 和 Curve448 算法的密钥协议
                      • JEP-327 Unicode 10
                        • JEP-328 Flight Recorder(飞行记录器)
                          • JEP-329 chaCha20 和 Poly1305 加密算法支持
                            • JPE330 启动单一文件的源代码程序
                              • JEP-331 低开销的 Heap Profiling
                                • JEP-332 TLS 1.3支持
                                  • JEP 335: 弃用 Nashorn JavaScript 引擎
                                    • JEP 336: 弃用 Pack200、unpack200 工具和 API
                                    • 总结
                                    相关产品与服务
                                    命令行工具
                                    腾讯云命令行工具 TCCLI 是管理腾讯云资源的统一工具。使用腾讯云命令行工具,您可以快速调用腾讯云 API 来管理您的腾讯云资源。此外,您还可以基于腾讯云的命令行工具来做自动化和脚本处理,以更多样的方式进行组合和重用。
                                    领券
                                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档