栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

JDK11学习笔记

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JDK11学习笔记

JDK11学习

1.用于lambda参数的局部变量语法

在jdk10为局部变量提供了隐式定义,在jdk11中允许可以在lambda表达式中使用var进行参数申明

 public static void main(String[] args) {
        Arrays.asList("Java", "Python", "C++")
            .forEach((var s) -> {
                System.out.println("Hello, " + s);
            });
    }

2新增api

2.1List API

List的toArray()还新增了一个重载方法,可以更方便地把List转换为数组。可以比较一下两种转换方法:

// 旧的方法:传入String[]:
String[] oldway = list.toArray(new String[list.size()]);
 
// 新的方法:传入IntFunction:
String[] newway = list.toArray(String[]::new);

2.2读写文件

对Files类增加了writeString和readString两个静态方法,可以直接把String写入文件,或者把整个文件读出为一个String。这两个方法可以大大简化读取配置文件之类的问题

//writeString
Files.writeString(
    Path.of("./", "tmp.txt"), // 路径
    "hello, jdk11 files api", // 内容
    StandardCharsets.UTF_8); // 编码

//readString
String s = Files.readString(
    Paths.get("./tmp.txt"), // 路径
    StandardCharsets.UTF_8); // 编码

2.3String API

2.3.1 String新增了strip()方法,和trim()相比,strip()可以去掉Unicode空格,例如,中文空格:

String s = " Hello, JDK11!u3000u3000";
System.out.println("     original: [" + s + "]");	//original: [ Hello, JDK11!  ]
System.out.println("         trim: [" + s.trim() + "]");	//trim: [Hello, JDK11!  ]
System.out.println("        strip: [" + s.strip() + "]");	//strip: [Hello, JDK11!]
System.out.println(" stripLeading: [" + s.stripLeading() + "]");	// stripLeading: [Hello, JDK11!  ]
System.out.println("stripTrailing: [" + s.stripTrailing() + "]");	//stripTrailing: [ Hello, JDK11!]

2.3.2新增isBlank()方法,可判断字符串是不是“空白”字符串:

String s = " u3000"; // 由一个空格和一个中文空格构成
System.out.println(s.isEmpty()); // false
System.out.println(s.isBlank()); // true

2.4新增lines()方法,可以非常方便地按行分割字符串

String s = "JavanPythonnRuby";
s.lines().forEach(System.out::println);
//打印:
Java
Python
Ruby

2.5新增repeat()方法,可以指定重复次数:

System.out.println("-".repeat(10)); 
//输出:---------

3.动态类文件常量

Java的类型文件格式将被拓展,支持一种新的常量池格式:CONSTANT_Dynamic,加载CONSTANT_Dynamic会将创建委托给bootstrap方法。

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

4.Epsilon :一个无操作的垃圾收集器

JDK上对这个特性的描述是:开发一个处理内存分配但不实现任何实际内存回收机制的GC,一旦可用堆内存用完,JVM就会退出。

如果有System.gc()的调用,实际上什么也不会发生(这种场景下和-XX:+DisableExplicitGC效果一样),因为没有内存回收,这个实现可能会警告用户尝试强制GC是徒劳。
用法:

-XX:+UseEpsilonGC。

提供完全被动的GC实现,具有有限的分配限制和尽可能低的延迟开销,但代价是内存占用和内存吞吐量。

众所周知,Java实现可广泛选择高度可配置的GC实现。 各种可用的收集器最终满足不同的需求,即使它们的可配置性使它们的功能相交。 有时更容易维护单独的实现,而不是在现有GC实现上堆积另一个配置选项。

它的主要用途如下:

性能测试(它可以帮助过滤掉GC引起的性能假象);
内存压力测试(例如,知道测试用例应该分配不超过1 GB的内存,我们可以使用-Xmx1g配置-XX:+UseEpsilonGC,如果违反了该约束,则会heap dump并崩溃);
非常短的JOB任务(对于这种任务,接受GC清理堆那都是浪费空间);
VM接口测试;
Last-drop 延迟&吞吐改进;

5.标准HTTP客户端

将JDK9引进并孵化的HTTP客户端API作为标准,即HTTP/2 Client。它定义了一个全新的实现了HTTP/2和WebSocket的HTTP客户端API,并且可以取代HttpURLConnection。现在支持异步非阻塞。

已经存在的HttpURLConnection有如下问题:

  • 在设计时考虑了多种协议,但是现在几乎所有协议现已不存在。
  • API早于HTTP/1.1并且太抽象;
  • 使用很不友好;
  • 只能以阻塞模式工作;
  • 非常难维护;

6.飞行器记录器

提供一个低开销的,为了排错Java应用问题,以及JVM问题的数据收集框架,达到的目标如下:

  • 提供用于生产和消费数据作为事件的API;
  • 提供缓存机制和二进制数据格式;
  • 允许事件配置和事件过滤;
  • 提供OS,JVM和JDK库的事件

排错,监控,性能分析是整个开发生命周期必不可少的一部分,但是某些问题只会在大量真实数据压力下才会发生在生产环境。

Flight Recorder记录源自应用程序,JVM和OS的事件。 事件存储在一个文件中,该文件可以附加到错误报告中并由支持工程师进行检查,允许事后分析导致问题的时期内的问题。工具可以使用API从记录文件中提取信息。

7.ZGC

ZGC, 这应该是JDK11最为瞩目的特性, 没有之一。GC暂停时间不会超过10ms,既能处理几百兆的小堆, 也能处理几个T的大堆(OMG),和G1相比, 应用吞吐能力不会下降超过15%,为未来的GC功能和利用colord指针以及Load barriers优化奠定基础,初始只支持64位系统

ZGC的设计目标是:支持TB级内存容量,暂停时间低(<10ms),对整个程序吞吐量的影响小于15%。 将来还可以扩展实现机制,以支持不少令人兴奋的功能,例如多层堆(即热对象置于DRAM和冷对象置于NVMe闪存),或压缩堆。 GC是java主要优势之一,当GC停顿太长, 就会开始影响应用的响应时间.消除或者减少GC停顿时长, java将对更广泛的应用场景是一个更有吸引力的平台. 此外, 现代系统中可用内存不断增长,用户和程序员希望JVM能够以高效的方式充分利用这些内存, 并且无需长时间的GC暂停时间

ZGC和G1停顿时间比较:

ZGC
avg: 1.091ms (+/-0.215ms)
95th percentile: 1.380ms
99th percentile: 1.512ms
99.9th percentile: 1.663ms
99.99th percentile: 1.681ms
max: 1.681ms

G1
avg: 156.806ms (+/-71.126ms)
95th percentile: 316.672ms
99th percentile: 428.095ms
99.9th percentile: 543.846ms
99.99th percentile: 543.846ms
max: 543.846ms

用法 : -XX:+UnlockExperimentalVMOptions –XX:+UseZGC, 需要通过JVM参数来解锁这个特性

8.Transport Layer Security (TLS1.3)

实现TLS协议1.3版本。(TLS允许客户端和服务端通过互联网以一种防止窃听,篡改以及消息伪造的方式进行通信)。

TLS 1.3是TLS协议的重大改进,与以前的版本相比,它提供了显着的安全性和性能改进。其他供应商的几个早期实现已经可用。我们需要支持TLS 1.3以保持竞争力并与最新标准保持同步。这个特性的实现动机和Unicode 10一样,也是紧跟历史潮流。

9.Low-Overhead Heap Profiling(低开销的 Heap Profiling)

提供一种低开销的Java堆分配采样方法,得到堆分配的Java对象信息,可通过JVMTI访问。希望达到的目标如下:

足够低的开销,可以默认且一直开启;
能通过定义好的程序接口访问;
能采样所有分配;
能给出生存和死亡的Java对象信息;
动机
对用户来说,了解它们堆里的内存是很重要的需求。目前有一些已经开发的工具,允许用户窥探它们的堆,比如:Java Flight Recorder, jmap, YourKit, 以及VisualVM tools.。但是这工具都有一个很大的缺点:无法得到对象的分配位置。headp dump以及heap histo都没有这个信息,但是这个信息对于调试内存问题至关重要。因为它能告诉开发者,他们的代码发生(尤其是坏的)分配的确切位置。

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

增强Java启动器支持运行单个Java源代码文件的程序。

单文件程序是指整个程序只有一个源码文件,通常是早期学习Java阶段,或者写一个小型工具类。以HelloWorld.java为例,运行它之前需要先编译。我们希望Java启动器能直接运行这个源码级的程序:

java HelloWorld.java 等价与 javac HelloWorld.java java -cp helloWorld.java

11.ChaCha20 and Poly1305 Cryptographic Algorithms(ChaCha20 和 Poly1305 加密算法)

实现RFC 7539中指定的 ChaCha20 和 ChaCha20-Poly1305 两种加密算法。

唯一一个其他广泛采用的RC4长期以来一直被认为是不安全的,业界一致认为当下ChaCha20-Poly1305是安全的。

  1. Unicode 10

Unicode是一个不断进化的工业标准,因此必须不断保持Java和Unicode最新版本同步。

更新平台API支持Unicode 10.0版本(Unicode 10.0概述:Unicode 10.0 增加了8518 个字符, 总计达到了136,690个字符. 并且增加了4个脚本, 总结139个脚本, 同时还有56个新的emoji表情符号。参考:http://unicode.org/versions/Unicode10.0.0/)。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/350997.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号