面试官问我Java9~14的有哪些重要的新特性,我哭了~~~( 二 )


Optional

  • 新增了orElseThrow()方法来在没有值时抛出异常
并行全垃圾回收器 G1从 Java9 开始 G1 就了默认的垃圾回收器 , G1 是以一种低延时的垃圾回收器来设计的 , 旨在避免进行 Full GC,但是 Java9 的 G1 的 FullGC 依然是使用单线程去完成标记清除算法,这可能会导致垃圾回收期在无法回收内存的时候触发 Full GC 。
为了最大限度地减少 Full GC 造成的应用停顿的影响 , 从 Java10 开始 , G1 的 FullGC 改为并行的标记清除算法 , 同时会使用与年轻代回收和混合回收相同的并行工作线程数量 , 从而减少了 Full GC 的发生 , 以带来更好的性能提升、更大的吞吐量 。
应用程序类数据共享在 Java 5 中就已经引入了类数据共享机制 (Class Data Sharing , 简称 CDS) , 允许将一组类预处理为共享归档文件 , 以便在运行时能够进行内存映射以减少 Java 程序的启动时间 , 当多个 Java 虚拟机(JVM)共享相同的归档文件时 , 还可以减少动态内存的占用量 , 同时减少多个虚拟机在同一个物理或虚拟的机器上运行时的资源占用
Java 10 在现有的 CDS 功能基础上再次拓展 , 以允许应用类放置在共享存档中 。 CDS 特性在原来的 bootstrap 类基础之上 , 扩展加入了应用类的 CDS (Application Class-Data Sharing) 支持 。 其原理为:在启动时记录加载类的过程 , 写入到文本文件中 , 再次启动时直接读取此启动文本并加载 。 设想如果应用环境没有大的变化 , 启动速度就会得到提升
其他特性
  • 线程-局部管控:Java 10 中线程管控引入 JVM 安全点的概念 , 将允许在不运行全局 JVM 安全点的情况下实现线程回调 , 由线程本身或者 JVM 线程来执行 , 同时保持线程处于阻塞状态 , 这种方式使得停止单个线程变成可能 , 而不是只能启用或停止所有线程
  • 备用存储装置上的堆分配:Java 10 中将使得 JVM 能够使用适用于不同类型的存储机制的堆 , 在可选内存设备上进行堆内存分配
  • 统一的垃圾回收接口:Java 10 中 , hotspot/gc 代码实现方面 , 引入一个干净的 GC 接口 , 改进不同 GC 源代码的隔离性 , 多个 GC 之间共享的实现细节代码应该存在于辅助类中 。 统一垃圾回收接口的主要原因是:让垃圾回收器(GC)这部分代码更加整洁 , 便于新人上手开发 , 便于后续排查相关问题 。
Java11Java11 于 2018 年 9 月 25 日正式发布 , 这是很重要的一个版本!Java 11 和 2017 年 9 月份发布的 Java 9 以及 2018 年 3 月份发布的 Java 10 相比 , 其最大的区别就是:在长期支持(Long-Term-Support)方面 , Oracle 表示会对 Java 11 提供大力支持 , 这一支持将会持续至 2026 年 9 月 。 这是据 Java 8 以后支持的首个长期版本 。
面试官问我Java9~14的有哪些重要的新特性,我哭了~~~文章插图
字符串加强Java 11 增加了一系列的字符串处理方法 , 如以下所示 。
Guide 哥:说白点就是多了层封装 , JDK 开发组的人没少看市面上常见的工具类框架啊!
//判断字符串是否为空" ".isBlank();//true//去除字符串首尾空格" Java ".strip();// "Java" //去除字符串首部空格" Java ".stripLeading();// "Java "//去除字符串尾部空格" Java ".stripTrailing();// " Java"//重复字符串多少次"Java".repeat(3);// "JavaJavaJava"//返回由行终止符分隔的字符串集合 。 "A\nB\nC".lines().count();// 3 "A\nB\nC".lines().collect(Collectors.toList()); ZGC:可伸缩低延迟垃圾收集器ZGC 即 Z Garbage Collector , 是一个可伸缩的、低延迟的垃圾收集器 。
ZGC 主要为了满足如下目标进行设计:
  • GC 停顿时间不超过 10ms
  • 即能处理几百 MB 的小堆 , 也能处理几个 TB 的大堆
  • 应用吞吐能力不会下降超过 15%(与 G1 回收算法相比)
  • 方便在此基础上引入新的 GC 特性和利用 colord
  • 针以及 Load barriers 优化奠定基础
  • 当前只支持 Linux/x64 位平台
ZGC 目前 处在实验阶段 , 只支持 Linux/x64 平台
标准 HTTP Client 升级Java 11 对 Java 9 中引入并在 Java 10 中进行了更新的 Http Client API 进行了标准化 , 在前两个版本中进行孵化的同时 , Http Client 几乎被完全重写 , 并且现在完全支持异步非阻塞 。
并且 , Java11 中 , Http Client 的包名由 jdk.incubator.http 改为java.net.http , 该 API 通过 CompleteableFuture 提供非阻塞请求和响应语义 。
使用起来也很简单 , 如下:
var request = HttpRequest.newBuilder().uri(URI.create("")).GET().build();var client = HttpClient.newHttpClient();// 同步HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString());System.out.println(response.body());// 异步client.sendAsync(request, HttpResponse.BodyHandlers.ofString()).thenApply(HttpResponse::body).thenAccept(System.out::println);