1.字符串加强

  1. // 判断字符串是否为空白
  2. " ".isBlank(); // true
  3. // 去除首尾空格
  4. " Javastack ".strip(); // "Javastack"
  5. // 去除尾部空格
  6. " Javastack ".stripTrailing();
  7. // 去除首部空格
  8. " Javastack ".stripLeading(); // "Javastack "
  9. // 复制字符串
  10. "Java".repeat(3); // "JavaJavaJava"
  11. // 行数统计
  12. "A\nB\nC".lines().count(); // 3

2.HttpClient API

这是 Java 9 开始引入的一个处理 HTTP 请求的的孵化 HTTP Client API,该 API 支持同步和异步,而在 Java 11 中已经为正式可用状态,你可以在java.net包中找到这个 Api

3.用于 Lambda 参数的局部变量语法

用于 Lambda 参数的局部变量语法简单来说就是支持类型推导:

  1. var x = new A();
  2. for (var x : xs) { ... }
  3. try (var x = ...) { ... } catch ...

4.ZGC

从JDK 9开始,JDK使用G1作为默认的垃圾回收器。G1可以说是GC的一个里程碑,G1之前的GC回收,还是基于固定的内存区域,而G1采用了一种“细粒度”的内存管理策略,不在固定的区分内存区域属于surviors、eden、old,而我们不需要再去对于年轻代使用一种回收策略,老年代使用一种回收策略,取而代之的是一种整体的内存回收策略。这种回收策略在我们当下cpu、内存、服务规模都越来越大的情况下提供了更好的表现,而这一代ZGC更是有了突破性的进步。

从原理上来理解,ZGC可以看做是G1之上更细粒度的内存管理策略。由于内存的不断分配回收会产生大量的内存碎片空间,因此需要整理策略防止内存空间碎片化,在整理期间需要将对于内存引用的线程逻辑暂停,这个过程被称为”Stop the world”。只有当整理完成后,线程逻辑才可以继续运行,一般而言,主要有如下几种方式优化”Stop the world”:

  • 使用多个线程同时回收(并行回收)
  • 回收过程分为多次停顿(增量回收)
  • 在程序运行期间回收,不需要停顿或只停顿很短时间(并发回收)
  • 只回收内存而不整理内存

ZGC主要采用的是并发回收的策略,相较于G1 ZGC最主要的提升是使用Load Barrier技术实现,引用R大对于ZGC的评价:
与标记对象的传统算法相比,ZGC在指针上做标记,在访问指针时加入Load Barrier(读屏障),比如当对象正被GC移动,指针上的颜色就会不对,这个屏障就会先把指针更新为有效地址再返回,也就是,永远只有单个对象读取时有概率被减速,而不存在为了保持应用与GC一致而粗暴整体的Stop The World。