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,而不需要额外的标志来解锁实验性功能。

mixureSecure

添加如下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的时候再写...