文档章节

jdk11的一些新特性理解

雨翔河
 雨翔河
发布于 2019/05/07 20:37
字数 2612
阅读 39
收藏 0

心血来潮想看看jdk11的新特性,喵了下官方文档,简单的翻译了下和增添了些自己的理解。

jdk11是lts版本,这是自 Java 8 后的首个长期支持版本,根据oracle的尿性,三年一个lts,所以这个版本在当前来看算是非常重要的一个版本,未来可能会成为主流。

2018年,美国当地时间9月25日,Oracle 官方宣布 Java 11 (18.9 LTS) 正式发布。

新特性也在官网有了介绍: https://www.oracle.com/technetwork/java/javase/11-relnote-issues-5012449.html

翻看了下还是蛮多新奇的东西。

重要改变有: Applets 和 Web Start Applications 已经从jdk11中删除了,以前在大学的时候用这玩意儿写过贪吃蛇。 和浏览器有关的这部分都移除了,我记得那时候就说不安全了,基本上的浏览器都放弃了java的applet。

在windows和mac上的jre自动自动更新功能取消了。

在Windows和macOS中,以前的版本中安装JDK时可以选择安装JRE。在JDK 11中,没有这个选项了。

在这个版本中,不再提供JRE或服务器JRE。只提供JDK。用户可以使用jlink创建更小的自定义运行时。 jlink是啥? https://docs.oracle.com/javase/9/tools/jlink.htm 可以使用jlink工具创建特定于平台的运行时映像。 运行时映像将包含指定的应用程序模块和只需的平台模块,从而减少运行时映像的大小。

JDK中不再包含JavaFX。现在可以从 openjfx.io 单独下载它。 去年还想用javafx写一个redis的操作工具界面,最后因为懒惰放弃了。。。

JDK 7、8、9和10中附带的 Java Mission Control 不再包含在Oracle JDK中。现在它是一个单独的下载。 刚毕业那会儿得知这个工具的用法,经常本地调试的时候就输入jmc打开界面就开始看线程的情况。

在JDK 11及以后版本中,不再提供法语、德语、意大利语、韩语、葡萄牙语(巴西语)、西班牙语和瑞典语的翻译。

Windows的更新打包格式已从tar.gz更改为.zip,这在Windows系统中更为常见。 macOS的更新包格式已从.app更改为.dmg,这更符合macOS的标准。

jdk11的性功能和增强的有哪些:

关于Java SE 11和JDK 11中的重要增强和新特性的另一个信息来源是Java SE 11 (18.9) (JSR 384)平台规范,它记录了在Java SE 10和Java SE 11之间对规范所做的更改 http://cr.openjdk.java.net/~iris/se/11/latestSpec/

JDK 11发行版包括对Unicode 10.0.0的支持。自从JDK 10发布以来,它支持Unicode 8.0.0, JDK 11结合了Unicode 9.0.0和10.0.0版本,包括: 16,018 新字符: 包括19个新4k电视标准的符号 比特币签名 128个emoji表情符号

10 个新的字符集

Adlam
Bhaiksuki
Marchen
Newa
Osage
Tangut
Masaram Gondi
Nushu
Soyombo
Zanabazar Square

18 个新的字符区 18个新区块,其中包括10个区用于上述新字符集,8个用于下列现有的字符集:

Cyrillic Extended-C
Mongolian Supplement
Ideographic Symbols and Punctuation
Tangut Components
Glagolitic Supplement
Syriac Supplement
Kana Extended-A
CJK Extension F

将 HTTP Client API 标准化,放入了jdk11中,以前写的试用性的api放在 jdk.incubator.http ,现在已经移除掉了,至少代码来自 jdk.incubator.http 的都将更新到标准的包名: java.net.http

java.util.Collection 接口添加了一个新的默认方法 toArray(IntFunction) ,其实看字面意思也能理解,就是允许collection可以转换到一个数组去,具体的可以去看doc。

JDK 11更新了基于 Unicode Consortium's CLDR (Common Locale Data Registry) 的 Locale Data 。 oracle说的Locale Data 应该就是它所支持的语言、地区、字符集和其他地区数据。

编译线程的延迟分配。 多了个 -XX:+UseDynamicNumberOfCompilerThreads 的配置。 动态的控制编译线程数,在TieredCompilation模式下(默认为打开),虚拟机在具有多个cpu的系统上启动大量编译线程,而不管可用内存和编译请求的数量。因为线程即使在空闲的时候也会消耗内存(几乎所有的时间都是空闲的),这导致了资源的低效使用。为了解决这个问题,实现被更改为在启动期间每种类型只启动一个编译器线程,并动态地处理其他线程的启动和关闭。它由一个新的命令行标志控制,默认是打开的。 如果你写过java的gui程序就知道,client和server的即时编译是不一样的,具体的可以去百度下,总之TieredCompilation模式开启的时候,可以使程序启动时,使用client编译器,在程序运行一段时间后,自动切换为server编译器,这样启动的时候超级快,运行之后再对代码进行编译优化然后翻译成更高效的执行码。

ZGC,一个可伸缩的低延迟垃圾收集器(实验性的)。 这个垃圾回收器的主要目的是: 停顿时间不超过10毫秒 停顿时间不会随着堆或实时设置的大小而增加 处理堆的范围从几百兆到几千兆不等的堆

ZGC的核心是并发垃圾收集器,这意味着所有繁重的工作(标记、压缩、引用处理、字符串表清理等)都是在Java线程继续执行时完成的,这极大地降低了垃圾收集对应用程序响应时间的负面影响。 这个垃圾回收机制是实验性的,所以要启用的话需要一起配这两个配置:

-XX:+UnlockExperimentalVMOptions
-XX:+UseZGC

这个实验版本的ZGC启用有以下限制: 只能在 Linux/x64 下使用。 XX:+UseCompressedOops 和 -XX:+UseCompressedClassPointers 配置将不会有任何效果,这两个配置不生效。 -XX:+ClassUnloading 和 -XX:+ClassUnloadingWithConcurrentMark 默认情况下禁用,启用也不会有任何效果。 ZGC不能和oracle的全栈虚拟机GraalVM一起用,说到GraalVM,不得不提下,这玩意儿简直吊炸天,可以将java或者其他语言编译成二进制文件直接执行,具体的自行查看oracle的文档: https://www.graalvm.org

Epsilon GC,一个不做任何事情的垃圾回收器,哈哈哈哈哈哈哈。 这玩意儿也是个实验性的垃圾回收器,不实现任何内存回收机制,它一般是用来做性能测试的,可以对比其他gc的回收成本,很方便的进行测试。

低开销的堆分析。 提供一种采样Java堆分配的低开销方法,可以通过JVMTI访问,这玩意儿好啊,不然采集堆的对象数据简直难受。 设计这个东西的目标是: 足够低的开销,默认情况下可以连续启用。 通过定义良好的编程接口(JVMTI)进行访问。 可以抽样分析所有类型的分配方式,也就是说不限于某种特定的堆区域或者特定的分配方式的区。 实现的方式定义可以独立出来,即不依赖于任何特定的GC算法或VM实现。 可以提供关于活着的Java对象和死去的Java对象的信息。

嵌套访问控制。 它允许多个class同属一个逻辑代码块,但是被编译成多个分散的class文件,它们访问彼此的私有成员无需通过编译器添加访问扩展方法。 这个得看代码,不看代码的话很难讲明白

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");
           //这里在 java 8环境下会报错,在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();
    }
}

说些题外话,美国一直有加密算法出口限制,近年来,美国放松了加密软件出口的条件,这次增加了一些密码算法的实现不知道和这个有没有关系。

使用RFC7748中描述的Curve25519和Curve448添加新密钥协议方案的实现。 Curve25519/Ed25519/X25519 是著名密码学家 Daniel J. Bernstein 在 2006 年独立设计的椭圆曲线加密 /签名 /密钥交换算法,和现有的任何椭圆曲线算法都完全独立。 关于Curve448的介绍可以看这里: https://en.wikipedia.org/wiki/Curve448

增加了Brainpool EC支持。 对于密码学不是很懂,大致的理解就是增加一种标准,椭圆曲线密码学(ECC)Brainpool标准。 具体的可以看: https://tools.ietf.org/html/rfc5639

实现了ChaCha20和Poly1305密码算法。 又是增加了一些加密的算法实现,说些题外话,美国一直有加密算法出口限制,近年来,美国放松了加密软件出口的条件,这次增加了一些密码算法的实现不知道和这个有没有关系。

增强密钥机制。 多了一个名为 jceks.key.serialFilter 的新安全配置。

RSASSA-PSS 签名支持添加到 SunMSCAPI。

Transport Layer Security (TLS) 1.3。 JDK 11发行版包含TLS 1.3规范的实现(RFC 8446)。

RFC 8009中定义的Kerberos 5支持AES加密和HMAC-SHA2。

Lambda参数的局部变量语法。 在声明lambda表达式的形式参数时,现在可以使用保留类型名称var。 啧啧啧,php啊,简直就是围城。

启动运行单文件源码程序。 通过“shebang”文件和相关技术,增强java启动程序,以运行作为java源代码单个文件提供的程序,包括在脚本中使用。 解释运行java代码,意味着可以像写脚本一样边写边执行java代码,类似于php的cmd模式输入代码实时出结果。

总结: 和jdk8比起来,jdk11好像并没有什么太吸引人的地方。。。

© 著作权归作者所有

雨翔河

雨翔河

粉丝 197
博文 77
码字总数 66035
作品 0
深圳
程序员
私信 提问
java学什么版本最好呢,jdk8都有什么新特性,jdk11有必要学吗?

java学什么版本最好呢,jdk8都有什么新特性,jdk11有必要学吗?学校里学的太老了

Harivz
2019/02/05
555
7
CSDN日报190227——5分钟了解《代码整洁之道》精华

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/blogdevteam/article/details/87978696 程序人生 | 5分钟了解《代码整洁之道》精华 作者:拭心 让软件能工作和...

CSDN官方博客
2019/02/27
0
0
SpringBoot 增强库 yue-library 更新,你们要的 JDK8 版本来了

yue-library yue-library是一个基于SpringBoot封装的基础库 内置丰富的JDK工具 自动装配了一系列的基础Bean与环境配置项 快速构建SpringCloud项目,让微服务变得更简单 你们要的JDK8版本来了...

yl-yue
2019/09/18
3.6K
8
发布倒计时!JDK11为我们带来哪些新特性?

  今年7月底,JDK11已经进入了Rampdown Phase Two阶段,这标志着该版本所有特性已经被冻结,不会有新的JEP会加入版本中。   这一阶段将会修复P1–P2级BUG,之后,JDK11预定于今年9月25日发...

溯源blog
2018/08/02
0
0
SpringBoot 增强库 yue-library 更新,提供模板项目

yue-library yue-library 是一个基于 SpringBoot 封装的基础库 内置丰富的 JDK 工具 自动装配了一系列的基础 Bean 与环境配置项 快速构建 SpringCloud 项目,让微服务变得更简单 收藏一波以表...

yl-yue
2019/10/15
2.6K
7

没有更多内容

加载失败,请刷新页面

加载更多

Go Web 编程之 数据库

概述 数据库用来存储数据。只要不是玩具项目,每个项目都需要用到数据库。现在用的最多的还是 MySQL,PostgreSQL的使用也在快速增长中。 在 Web 开发中,数据库也是必须的。本文将介绍如何在...

darjunlee
今天
51
0
spring-boot-maven-plugin not found的解决方案。

通过IDE创建一个springboot项目, <plugin> <groupId>org.springframework.boot</groupId>//这行红色 <artifactId>spring-boot-maven-plugin</artifactId>//这行红色</plugin> 提示sprin......

一片云里的天空
今天
84
0
OSChina 周三乱弹 —— 我可能是个憨憨

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 @宇辰OSC :分享Hare Je的单曲《Alan Walker-Faded(Hare Je remix)》: #今日歌曲推荐# 可以放松大脑的一首纯音乐 《Alan Walker-Faded(Har...

小小编辑
今天
266
3
搞定SpringBoot多数据源(3):参数化变更源

春节将至,今天放假了,在此祝小伙伴们新春大吉,身体健康,思路清晰,永远无BUG! 一句话概括:参数化变更源意思是根据参数动态添加数据源以及切换数据源,解决不确定数据源的问题。 1. 引言...

mason技术记录
昨天
99
0
sql 基础知识

sql 基础知识 不要极至最求一条sql语句搞定一切,可合理拆分为多条语句 1. sql 变量定义与赋值 Sql 语句中,直接在SELECT使用@定义一个变量,如:[@a](https://my.oschina.net/a8856225a)。 ...

DrChenXX
昨天
57
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部