JDK11版本
# JDK11版本
挑几个比较重要的或者好用的特性学习下
# 1、全新的 HTTP 客户端 API
全新的 HTTP 客户端 API 优势:
- ①、HTTP/2支持: 全新的 HttpClient 支持 HTTP/2 协议的所有特性,包括同步和异步编程模型。
- ②、WebSocket支持: 支持WebSocket,允许建立持久的连接,并进行全双工通信。
- ③、同步和异步: 提供了同步和异步的两种模式。
- ④、链式调用: 新的HttpClient 允许链式调用,使得构建和发送请求变得更简单。
- ⑤、更好的错误处理机制: 新的HttpClient 提供了更好的错误处理机制,当HTTP请求失败时,可以通过异常机制更清晰地了解到发生了什么。
HTTP 客户端 核心类:
java.net.http.HttpClient
java.net.http.HttpRequest
java.net.http.HttpResponse
HttpClient类常用方法:
方法 | 注释 |
---|---|
connectTimeout() | 设置建立HTTP连接的超时时间 |
version() | 指定HTTP协议的版本(HTTP/1.1或HTTP/2) |
executor() | 设置自定义的Executor,该Executor用于异步任务 |
authenticator() | 设置HTTP身份验证 |
sslParameters() | 设置SSL/TLS的配置 |
HttpRequest类常用方法:
方法 | 注释 |
---|---|
uri() | 设置统一资源标识符 (URI) |
header() | 单个添加请求头 |
headers() | 批量添加请求头 |
setHeader() | 设置特定的请求头 |
GET() | 创建一个 GET 请求 |
POST(HttpRequest.BodyPublisher body) | 创建一个带有请求体的 POST 请求 |
PUT(HttpRequest.BodyPublisher body) | 创建一个带有请求体的 PUT 请求 |
DELETE() | 创建一个 DELETE请求 |
HttpResponse类常用方法:
方法 | 注释 |
---|---|
statusCode() | 获取HTTP响应的状态码 |
body() | 获取HTTP响应体 |
headers() | 获取HTTP响应头 |
同步请求使用示例:
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;
public class TestA {
public static void main(String[] args) {
HttpClient client = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(10)) // 连接超时为10秒
.build();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://www.baidu.com")) // 链接
.GET() // 请求方式
.timeout(Duration.ofSeconds(10)) // 接口超时时间
.build();
HttpResponse<String> response = null;
try {
response = client.send(request, HttpResponse.BodyHandlers.ofString());
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(response.body());
}
}
异步请求使用示例:
public static void main(String[] args) {
// 构建 HttpClient 对象
HttpClient httpClient = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(10)) // 连接超时为10秒
.build();
// 构建 HttpRequest 对象
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://www.baidu.com")) // 链接
.timeout(Duration.ofSeconds(5)) // 超时时间为 5 秒
.GET() // 请求方式
.build();
// 发送异步请求
CompletableFuture<HttpResponse<String>> futureResponse = httpClient.sendAsync(request, HttpResponse.BodyHandlers.ofString());
// 处理响应
futureResponse.thenApply(HttpResponse::body) // 获取响应体
.thenAccept(System.out::println); // 打印响应体
System.out.println("异步请求");
futureResponse.join(); // 等待处理完成
}
# 2、处理文本文件的API
这两个API对于处理文本文件非常好用。
Files.readString(Path path):读取一个文件的所有内容并将其返回为一个字符串。
Files.writeString(Path path, CharSequence csq, OpenOption... options):将一个字符串写入到文件中。
代码示例:
public class TestA {
public static void main(String[] args) throws IOException {
Path path = Path.of("C:\\Users\\Administrator\\Desktop\\123.txt");
String s = Files.readString(path);
System.out.println(s);
String ss = "123231\nwqedqwew\nqweqwewq";
/**
* StandardOpenOption的值 默认是 CREATE 和 WRITE
*
* READ, 允许文件通道进行读取操作
* WRITE, 允许文件通道进行写入操作
* APPEND, 指示应该在文件的当前结尾之后追加数据,如果文件不存在,则创建新文件。
* TRUNCATE_EXISTING, 如果文件已经存在,将其长度截断为0,即清空文件内容,然后开始写入。
* CREATE, 如果指定的文件不存在,则创建它。如果文件已存在,这个选项本身不会影响其内容。
* CREATE_NEW, 仅在文件不存在时创建新文件。如果文件已存在,则写入操作失败并抛出FileAlreadyExistsException异常。
* DELETE_ON_CLOSE, 当关闭相关的通道或流时,自动删除此文件。这对于临时文件特别有用。
* SPARSE, 指示文件系统应为文件使用稀疏文件支持。这对于大文件特别有用,可以减少实际分配的磁盘空间。
* SYNC, 要求对文件的元数据和内容的更新同步写入到存储设备。这是最安全但可能较慢的选项,确保了在发生系统崩溃后数据的一致性。
* DSYNC; 也称为DATA_SYNC):要求仅文件内容的更新同步写入到存储设备,而元数据更新可以有不同的同步策略。
* 相比SYNC,这个选项提供了较好的性能折衷,但仍保证了数据的基本完整性。
*
* */
Files.writeString(path, ss);
}
}
# 3、新增 ZGC
Z Garbage Collector,这款垃圾回收器的主要特点是可伸缩的、低延迟。
低延迟:ZGC旨在实现暂停时间不超过10毫秒的目标。这对于要求极低停顿时间的应用(如金融服务、交易系统和大型Web服务)非常有利。
可扩展性:ZGC设计用于处理非常大的内存容量,能够高效管理数百GB乃至TB级别的堆内存,非常适合现代云基础设施中的大内存服务器。
并发执行:几乎所有垃圾回收工作都是并发执行的,包括标记、重定位(即移动存活对象)、压缩等过程,从而大大减少了应用程序的停顿时间。
无分代设计:ZGC摒弃了传统分代收集器中的年轻代和老年代的概念,转而采用统一的内存管理方式,虽然它内部有类似颜色的区分来优化垃圾回收效率,但对外呈现的是单一内存池。
可选择的内存限制:用户可以通过JVM参数设置堆内存的使用上限,ZGC会尝试保持堆的使用不超过这个限制,有助于容器化环境中的资源管理。
ZGC的使用:
ZGC在JDK11版本 ,只支持 Linux/x64 操作系统。
为了方便演示,我这里 使用JDK22版本在 Windows系统上演示。
ZGC垃圾回收器 需要手动指定。
在JVM的启动参数上新增如下参数:
-XX:+UnlockExperimentalVMOptions -XX:+UseZGC
-XX:+UnlockExperimentalVMOptions 允许使用实验性特性
-XX:+UseZGC 使用ZGC 作为垃圾回收器
从JDK 15开始,ZGC(Z Garbage Collector)就已经成为默认启用的垃圾收集器之一,无需再使用-XX:+UnlockExperimentalVMOptions来解锁实验性特性。这意味着从JDK 15及之后的版本可以直接通过 -XX:+UseZGC 选项来启用ZGC,而不需要额外的标志来解锁实验性功能。
添加如下JVM启动参数: -Xlog:gc*:file=gc.log:time
看下启动后的gc日志:
[2024-05-28T15:05:46.172+0800] Initializing The Z Garbage Collector // 初始化ZGC
[2024-05-28T15:05:46.172+0800] Version: 22.0.1+8-16 (release) // Java版本
[2024-05-28T15:05:46.172+0800] Using legacy single-generation mode // ZGC当前配置为使用传统的单代模式进行垃圾回收
[2024-05-28T15:05:46.172+0800] NUMA Support: Disabled // NUMA(非统一内存访问)优化未被启用
[2024-05-28T15:05:46.172+0800] CPUs: 8 total, 8 available // 系统总共有8个CPU核心,全部可用,并且可用内存为16.2GB
[2024-05-28T15:05:46.172+0800] Memory: 16207M // 系统总共有8个CPU核心,全部可用,并且可用内存为16.2GB
[2024-05-28T15:05:46.172+0800] Large Page Support: Disabled // 大页内存支持,大页可以减少内存管理开销
[2024-05-28T15:05:46.172+0800] GC Workers: 2 (dynamic) // 有2个动态调整的垃圾回收工作线程
[2024-05-28T15:05:46.172+0800] Address Space Type: Contiguous/Unrestricted/Complete // ZGC的地址空间配置,大小为9.6GB,采用连续、不受限、完整的地址空间类型
[2024-05-28T15:05:46.173+0800] Address Space Size: 3200M x 3 = 9600M // ZGC的地址空间配置,大小为9.6GB,采用连续、不受限、完整的地址空间类型
[2024-05-28T15:05:46.173+0800] Min Capacity: 8M // 最小堆容量8MB
[2024-05-28T15:05:46.173+0800] Initial Capacity: 200M //初始化堆容量200MB
[2024-05-28T15:05:46.173+0800] Max Capacity: 200M //最大堆容量200MB
[2024-05-28T15:05:46.173+0800] Medium Page Size: 4M // 设置为4MB,这通常用于内部内存分配和管理
[2024-05-28T15:05:46.173+0800] Pre-touch: Disabled // 不会预先分配和初始化所有内存页以减少以后的页面错误,这可能会在首次访问时增加延迟
[2024-05-28T15:05:46.173+0800] Uncommit: Enabled // 启用了解除提交内存功能,允许JVM释放不再需要的物理内存给操作系统,并设置了300秒的延迟
[2024-05-28T15:05:46.173+0800] Uncommit Delay: 300s
[2024-05-28T15:05:46.181+0800] Runtime Workers: 2 // 运行时工作线程: 同样为2个,与GC工作线程数一致
[2024-05-28T15:05:46.181+0800] Using The Z Garbage Collector // 开始使用 ZGC
关于ZGC更深入的知识点 在后面学习JVM的时候再写...