Skip to content

Commit 61c1646

Browse files
committed
docs: java 新特性内容规范和优化
1 parent 8b2697d commit 61c1646

File tree

16 files changed

+634
-458
lines changed

16 files changed

+634
-458
lines changed

docs/java/new-features/java10.md

Lines changed: 34 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -10,19 +10,21 @@ head:
1010
content: Java 10,JDK10,var 局部变量类型推断,垃圾回收改进,性能
1111
---
1212

13-
**Java 10** 发布于 2018 年 3 月 20 日,最知名的特性应该是 `var` 关键字(局部变量类型推断)的引入了,其他还有垃圾收集器改善、GC 改进、性能提升、线程管控等一批新特性
13+
**Java 10** 发布于 2018 年 3 月 20 日,这是一个非 LTS(长期支持)版本,Oracle 仅提供六个月的支持
1414

15-
**概览(精选了一部分)**
15+
![](https://oss.javaguide.cn/github/javaguide/java/new-features/jdk8~jdk24.png)
1616

17-
- [JEP 286:局部变量类型推断](https://openjdk.java.net/jeps/286)
18-
- [JEP 304:垃圾回收器接口](https://openjdk.java.net/jeps/304)
19-
- [JEP 307:G1 并行 Full GC](https://openjdk.java.net/jeps/307)
20-
- [JEP 310:应用程序类数据共享(扩展 CDS 功能)](https://openjdk.java.net/jeps/310)
21-
- [JEP 317:实验性的基于 Java 的 JIT 编译器](https://openjdk.java.net/jeps/317)
17+
这篇文章会挑选其中较为重要的一些新特性进行详细介绍:
2218

23-
## 局部变量类型推断(var)
19+
- [JEP 286: Local-Variable Type Inference(局部变量类型推断)](https://openjdk.org/jeps/286)
20+
- [JEP 304: Garbage-Collector Interface(垃圾回收器接口)](https://openjdk.org/jeps/304)
21+
- [JEP 307: Parallel Full GC for G1(G1 并行 Full GC)](https://openjdk.org/jeps/307)
22+
- [JEP 310: Application Class-Data Sharing(应用程序类数据共享)](https://openjdk.org/jeps/310)
23+
- [JEP 317: Experimental Java-Based JIT Compiler(实验性的基于 Java 的 JIT 编译器)](https://openjdk.org/jeps/317)
2424

25-
由于太多 Java 开发者希望 Java 中引入局部变量推断,于是 Java 10 的时候它来了,也算是众望所归了!
25+
## JEP 286: Local-Variable Type Inference
26+
27+
由于太多 Java 开发者希望 Java 中引入局部变量类型推断,于是 Java 10 的时候它来了,也算是众望所归了!
2628

2729
Java 10 提供了 `var` 关键字声明局部变量。
2830

@@ -50,19 +52,35 @@ var 并不会改变 Java 是一门静态类型语言的事实,编译器负责
5052

5153
另外,Scala 和 Kotlin 中已经有了 `val` 关键字 ( `final var` 组合关键字)。
5254

53-
相关阅读:[《Java 10 新特性之局部变量类型推断》](https://zhuanlan.zhihu.com/p/34911982)
54-
55-
## 垃圾回收器接口
55+
## JEP 304: Garbage-Collector Interface
5656

5757
在早期的 JDK 结构中,组成垃圾收集器 (GC) 实现的组件分散在代码库的各个部分。 Java 10 通过引入一套纯净的垃圾收集器接口来将不同垃圾收集器的源代码分隔开。
5858

59-
## G1 并行 Full GC
59+
## JEP 307: Parallel Full GC for G1
6060

6161
从 Java9 开始 G1 就成了默认的垃圾回收器,G1 是以一种低延时的垃圾回收器来设计的,旨在避免进行 Full GC,但是 Java9 的 G1 的 FullGC 依然是使用单线程去完成标记清除算法,这可能会导致垃圾回收器在无法回收内存的时候触发 Full GC。
6262

6363
为了最大限度地减少 Full GC 造成的应用停顿的影响,从 Java10 开始,G1 的 FullGC 改为并行的标记清除算法,同时会使用与年轻代回收和混合回收相同的并行工作线程数量,从而减少了 Full GC 的发生,以带来更好的性能提升、更大的吞吐量。
6464

65-
## 集合增强
65+
## JEP 310: **应用程序类数据共享(扩展 CDS 功能)**
66+
67+
在 Java 5 中就已经引入了类数据共享机制 (Class Data Sharing,简称 CDS),允许将一组类预处理为共享归档文件,以便在运行时能够进行内存映射以减少 Java 程序的启动时间,当多个 Java 虚拟机(JVM)共享相同的归档文件时,还可以减少动态内存的占用量,同时减少多个虚拟机在同一个物理或虚拟的机器上运行时的资源占用。CDS 在当时还是 Oracle JDK 的商业特性。
68+
69+
Java 10 在现有的 CDS 功能基础上再次拓展,以允许应用类放置在共享存档中。CDS 特性在原来的 bootstrap 类基础之上,扩展加入了应用类的 CDS 为 (Application Class-Data Sharing,AppCDS) 支持,大大加大了 CDS 的适用范围。其原理为:在启动时记录加载类的过程,写入到文本文件中,再次启动时直接读取此启动文本并加载。设想如果应用环境没有大的变化,启动速度就会得到提升。
70+
71+
## JEP 317: **实验性的基于 Java 的 JIT 编译器**
72+
73+
Graal 是一个基于 Java 语言编写的 JIT 编译器,是 JDK 9 中引入的实验性 Ahead-of-Time (AOT) 编译器的基础。
74+
75+
Oracle 的 HotSpot VM 便附带两个用 C++ 实现的 JIT compiler:C1 及 C2。在 Java 10 (Linux/x64, macOS/x64) 中,默认情况下 HotSpot 仍使用 C2,但通过向 java 命令添加 `-XX:+UnlockExperimentalVMOptions -XX:+UseJVMCICompiler` 参数便可将 C2 替换成 Graal。
76+
77+
## API 增强
78+
79+
并不是所有的 API 改动都会通过 JEP(Java Enhancement Proposal)来发布。
80+
81+
在 JDK 的开发流程中:**JEP** 通常用于重大的改变,例如引入新的语言特性(如 `var`)、新的 JVM 机制(如 ZGC)或者大规模的库重构。像 `List.copyOf()` 这种在现有类中增加几个静态方法的操作,通常被视为常规的库维护。它们由 JDK 开发者直接通过 **JBS (JDK Bug System)** 的工单(Ticket)进行提交和评审,然后随版本直接发布。
82+
83+
### 集合增强
6684

6785
`List``Set``Map` 提供了静态方法`copyOf()`返回入参集合的一个不可变拷贝。
6886

@@ -74,7 +92,7 @@ static <E> List<E> copyOf(Collection<? extends E> coll) {
7492

7593
使用 `copyOf()` 创建的集合为不可变集合,不能进行添加、删除、替换、 排序等操作,不然会报 `java.lang.UnsupportedOperationException` 异常。 IDEA 也会有相应的提示。
7694

77-
![](https://oss.javaguide.cn/java-guide-blog/image-20210816154125579.png)
95+
![使用 `copyOf()` 创建的集合为不可变集合](https://oss.javaguide.cn/java-guide-blog/image-20210816154125579.png)
7896

7997
并且,`java.util.stream.Collectors` 中新增了静态方法,用于将流中的元素收集为不可变的集合。
8098

@@ -84,7 +102,7 @@ list.stream().collect(Collectors.toUnmodifiableList());
84102
list.stream().collect(Collectors.toUnmodifiableSet());
85103
```
86104

87-
## Optional 增强
105+
### Optional 增强
88106

89107
`Optional` 新增了一个无参的 `orElseThrow()` 方法,作为带参数的 `orElseThrow(Supplier<? extends X> exceptionSupplier)` 的简化版本,在没有值时默认抛出一个 NoSuchElementException 异常。
90108

@@ -93,20 +111,6 @@ Optional<String> optional = Optional.empty();
93111
String result = optional.orElseThrow();
94112
```
95113

96-
## 应用程序类数据共享(扩展 CDS 功能)
97-
98-
在 Java 5 中就已经引入了类数据共享机制 (Class Data Sharing,简称 CDS),允许将一组类预处理为共享归档文件,以便在运行时能够进行内存映射以减少 Java 程序的启动时间,当多个 Java 虚拟机(JVM)共享相同的归档文件时,还可以减少动态内存的占用量,同时减少多个虚拟机在同一个物理或虚拟的机器上运行时的资源占用。CDS 在当时还是 Oracle JDK 的商业特性。
99-
100-
Java 10 在现有的 CDS 功能基础上再次拓展,以允许应用类放置在共享存档中。CDS 特性在原来的 bootstrap 类基础之上,扩展加入了应用类的 CDS 为 (Application Class-Data Sharing,AppCDS) 支持,大大加大了 CDS 的适用范围。其原理为:在启动时记录加载类的过程,写入到文本文件中,再次启动时直接读取此启动文本并加载。设想如果应用环境没有大的变化,启动速度就会得到提升。
101-
102-
## 实验性的基于 Java 的 JIT 编译器
103-
104-
Graal 是一个基于 Java 语言编写的 JIT 编译器,是 JDK 9 中引入的实验性 Ahead-of-Time (AOT) 编译器的基础。
105-
106-
Oracle 的 HotSpot VM 便附带两个用 C++ 实现的 JIT compiler:C1 及 C2。在 Java 10 (Linux/x64, macOS/x64) 中,默认情况下 HotSpot 仍使用 C2,但通过向 java 命令添加 `-XX:+UnlockExperimentalVMOptions -XX:+UseJVMCICompiler` 参数便可将 C2 替换成 Graal。
107-
108-
相关阅读:[深入浅出 Java 10 的实验性 JIT 编译器 Graal - 郑雨迪](https://www.infoq.cn/article/java-10-jit-compiler-graal)
109-
110114
## 其他
111115

112116
- **线程-局部管控**:Java 10 中线程管控引入 JVM 安全点的概念,将允许在不运行全局 JVM 安全点的情况下实现线程回调,由线程本身或者 JVM 线程来执行,同时保持线程处于阻塞状态,这种方式使得停止单个线程变成可能,而不是只能启用或停止所有线程

docs/java/new-features/java11.md

Lines changed: 50 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
title: Java 11 新特性概览
2+
title: Java 11 新特性概览(重要)
33
description: 总结 JDK 11 的更新,关注新 HTTP 客户端与字符串增强等实用特性。
44
category: Java
55
tag:
@@ -10,20 +10,22 @@ head:
1010
content: Java 11,JDK11,LTS,HTTP 客户端,字符串 API,移除特性
1111
---
1212

13-
**Java 11** 于 2018 年 9 月 25 日正式发布,这是很重要的一个版本!Java 11 和 2017 年 9 月份发布的 Java 9 以及 2018 年 3 月份发布的 Java 10 相比,其最大的区别就是:在长期支持(Long-Term-Support)方面,**Oracle 表示会对 Java 11 提供大力支持,这一支持将会持续至 2026 年 9 月。这是据 Java 8 以后支持的首个长期版本。**
13+
Java 11 于 2018 年 9 月 25 日正式发布,这是很重要的一个版本!Java 11 是继 Java 8 之后的第一个长期支持(Long-Term-Support)版本,Oracle 表示会对 Java 11 提供大力支持,这一支持将会持续至 2026 年 9 月。
1414

1515
下面这张图是 Oracle 官方给出的 Oracle JDK 支持的时间线。
1616

17-
![](https://oss.javaguide.cn/github/javaguide/java/new-features/4c1611fad59449edbbd6e233690e9fa7.png)
17+
![Oracle 官方给出的 Oracle JDK 支持的时间线](https://oss.javaguide.cn/github/javaguide/java/new-features/4c1611fad59449edbbd6e233690e9fa7.png)
1818

19-
**概览(精选了一部分)**
19+
![](https://oss.javaguide.cn/github/javaguide/java/new-features/jdk8~jdk24.png)
2020

21-
- [JEP 321:HTTP Client 标准化](https://openjdk.java.net/jeps/321)
22-
- [JEP 333:ZGC(可伸缩低延迟垃圾收集器)](https://openjdk.java.net/jeps/333)
23-
- [JEP 323:Lambda 参数的局部变量语法](https://openjdk.java.net/jeps/323)
24-
- [JEP 330:启动单文件源代码程序](https://openjdk.java.net/jeps/330)
21+
这篇文章会挑选其中较为重要的一些新特性进行详细介绍:
2522

26-
## HTTP Client 标准化
23+
- [JEP 321: HTTP Client (Standard)](https://openjdk.org/jeps/321)
24+
- [JEP 323: Local-Variable Syntax for Lambda Parameters](https://openjdk.org/jeps/323)
25+
- [JEP 330: Launch Single-File Source-Code Programs](https://openjdk.org/jeps/330)
26+
- [JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)](https://openjdk.org/jeps/333)
27+
28+
## JEP 321: HTTP Client(HTTP 客户端,标准版)
2729

2830
Java 11 对 Java 9 中引入并在 Java 10 中进行了更新的 Http Client API 进行了标准化,在前两个版本中进行孵化的同时,Http Client 几乎被完全重写,并且现在完全支持异步非阻塞。
2931

@@ -46,36 +48,7 @@ client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
4648
.thenAccept(System.out::println);
4749
```
4850

49-
## String 增强
50-
51-
Java 11 增加了一系列的字符串处理方法:
52-
53-
```java
54-
//判断字符串是否为空
55-
" ".isBlank();//true
56-
//去除字符串首尾空格
57-
" Java ".strip();// "Java"
58-
//去除字符串首部空格
59-
" Java ".stripLeading(); // "Java "
60-
//去除字符串尾部空格
61-
" Java ".stripTrailing(); // " Java"
62-
//重复字符串多少次
63-
"Java".repeat(3); // "JavaJavaJava"
64-
//返回由行终止符分隔的字符串集合。
65-
"A\nB\nC".lines().count(); // 3
66-
"A\nB\nC".lines().collect(Collectors.toList());
67-
```
68-
69-
## Optional 增强
70-
71-
新增了`isEmpty()`方法来判断指定的 `Optional` 对象是否为空。
72-
73-
```java
74-
var op = Optional.empty();
75-
System.out.println(op.isEmpty());//判断指定的 Optional 对象是否为空
76-
```
77-
78-
## ZGC(可伸缩低延迟垃圾收集器)
51+
## JEP 333: ZGC(可扩展的低延迟垃圾收集器,实验性)
7952

8053
**ZGC 即 Z Garbage Collector**,是一个可伸缩的、低延迟的垃圾收集器。
8154

@@ -95,7 +68,7 @@ ZGC 目前 **处在实验阶段**,只支持 Linux/x64 平台。
9568

9669
详情可以看:[《新一代垃圾回收器 ZGC 的探索与实践》](https://tech.meituan.com/2020/08/06/new-zgc-practice-in-meituan.html)
9770

98-
## Lambda 参数的局部变量语法
71+
## JEP 323: Local-Variable Syntax for Lambda Parameters(Lambda 参数的局部变量语法
9972

10073
从 Java 10 开始,便引入了局部变量类型推断这一关键特性。类型推断允许使用关键字 var 作为局部变量的类型而不是实际类型,编译器根据分配给变量的值推断出类型。
10174

@@ -114,19 +87,54 @@ Consumer<String> consumer = (var i) -> System.out.println(i);
11487
Consumer<String> consumer = (String i) -> System.out.println(i);
11588
```
11689

117-
## 启动单文件源代码程序
90+
## JEP 330: Launch Single-File Source-Code Programs(启动单文件源代码程序
11891

11992
这意味着我们可以运行单一文件的 Java 源代码。此功能允许使用 Java 解释器直接执行 Java 源代码。源代码在内存中编译,然后由解释器执行,不需要在磁盘上生成 `.class` 文件了。唯一的约束在于所有相关的类必须定义在同一个 Java 文件中。
12093

12194
对于 Java 初学者并希望尝试简单程序的人特别有用,并且能和 jshell 一起使用,一定程度上增强了使用 Java 来写脚本程序的能力。
12295

96+
## API 增强
97+
98+
并不是所有的 API 改动都会通过 JEP(Java Enhancement Proposal)来发布。
99+
100+
在 JDK 的开发流程中:**JEP** 通常用于重大的改变,例如引入新的语言特性(如 `var`)、新的 JVM 机制(如 ZGC)或者大规模的库重构。像 `String.isBlank()` 这种在现有类中增加几个方法的操作,通常被视为常规的库维护。它们由 JDK 开发者直接通过 **JBS (JDK Bug System)** 的工单(Ticket)进行提交和评审,然后随版本直接发布。
101+
102+
### String 增强
103+
104+
Java 11 增加了一系列的字符串处理方法:
105+
106+
```java
107+
//判断字符串是否为空
108+
" ".isBlank();//true
109+
//去除字符串首尾空格
110+
" Java ".strip();// "Java"
111+
//去除字符串首部空格
112+
" Java ".stripLeading(); // "Java "
113+
//去除字符串尾部空格
114+
" Java ".stripTrailing(); // "Java"
115+
//重复字符串多少次
116+
"Java".repeat(3); // "JavaJavaJava"
117+
//返回由行终止符分隔的字符串集合。
118+
"A\nB\nC".lines().count(); // 3
119+
"A\nB\nC".lines().collect(Collectors.toList());
120+
```
121+
122+
### Optional 增强
123+
124+
新增了`isEmpty()`方法来判断指定的 `Optional` 对象是否为空。
125+
126+
```java
127+
var op = Optional.empty();
128+
System.out.println(op.isEmpty());//判断指定的 Optional 对象是否为空
129+
```
130+
123131
## 其他新特性
124132

125133
- **新的垃圾回收器 Epsilon**:一个完全消极的 GC 实现,分配有限的内存资源,最大限度的降低内存占用和内存吞吐延迟时间
126134
- **低开销的 Heap Profiling**:Java 11 中提供一种低开销的 Java 堆分配采样方法,能够得到堆分配的 Java 对象信息,并且能够通过 JVMTI 访问堆信息
127135
- **TLS1.3 协议**:Java 11 中包含了传输层安全性(TLS)1.3 规范(RFC 8446)的实现,替换了之前版本中包含的 TLS,包括 TLS 1.2,同时还改进了其他 TLS 功能,例如 OCSP 装订扩展(RFC 6066,RFC 6961),以及会话散列和扩展主密钥扩展(RFC 7627),在安全性和性能方面也做了很多提升
128136
- **飞行记录器(Java Flight Recorder)**:飞行记录器之前是商业版 JDK 的一项分析工具,但在 Java 11 中,其代码被包含到公开代码库中,这样所有人都能使用该功能了。
129-
- ……
137+
- ......
130138

131139
## 参考
132140

0 commit comments

Comments
 (0)