2024年3月

作者引言

  • 很高兴啊,我们来到了第一篇,程序员的HelloWorld,快速开始RPC之游

快速入门

演示如何在几分钟内,使用
IceRPC
,构建和运行一个完整的客户端-服务器(C/S)应用程序.

必要条件: 只要电脑安装
.NET 8 SDK
就行了.

来吧,开始你的RPC之旅

接下来,我们要一起构建一个简单的网络应用程序,包括如下:

  • 服务端: 一个叫 greeter 服务的服务器
  • 客户端: 与服务器建立连接,并注册
    greeter
    服务,之后调用服务
    greet
    方法

客户端与服务器都是使用普通的控制台应用程序,没有Asp.net,没有依赖注入,简单吧.

来,我们开始:

第一步,我们先安装一个
dotnet
模板(打开cmd或terminal),可以快速生成,启动项目:

dotnet new install IceRpc.Templates

接下来,我们创建一个服务端:

直接用刚安装的模板,用
icerpc-slice-server
建一个服务
MyServer
,如下示:

dotnet new icerpc-slice-server -o MyServer

上面运行后,会生成 IceRPC + Slice 集成服务端项目,生成在目录
MyServer
下.

接下来,差不多,我们也用另一个模板
icerpc-slice-client
生成一个客户端叫
MyClient
:

dotnet new icerpc-slice-client -o MyClient

上面运行后,会生成 IceRPC + Slice 集成客户端项目,生成在目录
MyClient
下.

现在,我们完成了客户端与服务端的生成,来,我们运行它吧.

启动服务端

进入刚生成的服务端目录
MyServer
,运行如下指令:

cd MyServer
dotnet run

服务器现在正在侦听来自客户端的新连接:

dbug: IceRpc.Server[11]
      Listener 'icerpc://[::0]?transport=tcp' has started accepting connections

启动客户端

打开另一个CMD或terminal,来启动客户端:

cd MyClient
dotnet run

客户端向服务器托管的服务发送一个
greet
请求:

dbug: IceRpc.ClientConnection[3]
      Client connection from '[::1]:61582' to '[::1]:4062' connected
info: IceRpc.Logger.LoggerInterceptor[0]
      Sent request greet to icerpc:/VisitorCenter.Greeter over
      [::1]:61582<->[::1]:4062 and received a response with status code Ok
Hello, Reece!
dbug: IceRpc.ClientConnection[6]
      Client connection from '[::1]:61582' to '[::1]:4062' shutdown
dbug: IceRpc.ClientConnection[5]
      Client connection from '[::1]:61582' to '[::1]:4062' disposed

接下来

祝贺,我们已经成功创建了第一个IceRPC应用程序,RPC大门已为您打开.

作者结语

  • 从第一行翻译开始,查看各种翻译,比如 百度翻译,有道翻译,加上自已的理解,有点小累啊
  • 翻译的不好,请手下留情,人也要成长的,谢谢
  • 如果对我有点小兴趣,如可加我个人微信哦,大家交个朋友,一起探讨人生。
  • 觉得还不错的话,点个


    image

在 Python 应用程序开发过程中,配置文件扮演着重要的角色。配置文件可以用来存储应用程序的各种设置、选项和参数,使得程序更加灵活和可配置。本文将介绍 Python 中如何使用配置文件,并提供一些常见的配置文件处理方法。

一、配置文件格式

常见的配置文件格式有多种,包括 INI 格式、JSON 格式、YAML 格式等。其中,INI 格式是一种简单且易于阅读和编辑的格式,通常用于存储简单的配置信息。下面是一个示例的 INI 格式配置文件:

[Database]
host = localhost
port = 3306
username = admin
password = 123456

[Logging]
level = DEBUG

二、使用 configparser 模块读写配置文件

Python 标准库中的 configparser 模块提供了简单而强大的方法来读写 INI 格式的配置文件。下面是一个示例:

import configparser

# 创建 ConfigParser 对象
config = configparser.ConfigParser()

# 读取配置文件
config.read('config.ini')

# 获取配置信息
db_host = config['Database']['host']
db_port = config['Database']['port']
db_username = config['Database']['username']
db_password = config['Database']['password']

logging_level = config['Logging']['level']

三、使用 json 模块读写配置文件

对于 JSON 格式的配置文件,可以使用 Python 内置的 json 模块来进行读写操作。示例:

import json

# 读取配置文件
with open('config.json', 'r') as f:
    config = json.load(f)

# 获取配置信息
db_host = config['Database']['host']
db_port = config['Database']['port']
db_username = config['Database']['username']
db_password = config['Database']['password']

logging_level = config['Logging']['level']

四、使用第三方库

除了标准库中的模块外,还有一些第三方库可以帮助更方便地处理配置文件,例如 pyyaml、toml、configobj 等。

pip install pyyaml
python
Copy code
import yaml

# 读取配置文件
with open('config.yaml', 'r') as f:
    config = yaml.safe_load(f)

# 获取配置信息
db_host = config['Database']['host']
db_port = config['Database']['port']
db_username = config['Database']['username']
db_password = config['Database']['password']

logging_level = config['Logging']['level']

结语

通过本文的介绍,您已经了解了 Python 中配置文件的基本使用方法。选择合适的配置文件格式、使用合适的库来读写配置文件,将有助于使您的 Python 应用程序更加灵活和可配置。在实际开发中,根据项目需求选择适合的配置文件处理方法,并遵循良好的配置文件设计原则,将有助于提高代码的可维护性和可扩展性。

介绍

在快速发展的软件开发和部署领域,Docker 已成为容器化的强大工具,
为打包、分发和运行应用程序提供了一种标准化的高效方式
。Docker 镜像在这一过程中发挥着至关重要的作用,是容器化应用程序的基础。
为确保最佳性能、可扩展性和安全性,在创建和管理 Docker 镜像时必须遵循最佳实践
。在本文中,我们将探讨通过 Docker 镜像最佳实践优化部署的关键策略。

选择正确的基础镜像

选择合适的基础镜像是构建 Docker 镜像时的一项基本决策。基础镜像是应用程序的起点,
提供基本的操作系统和依赖项
。考虑使用来自 Docker Hub 等可信来源的官方镜像,因为它们会定期更新并由社区维护。
选择简约的基础镜像,以优化镜像大小
。Alpine Linux 因其轻量级特性而备受青睐。

# Use a minimal Alpine Linux base image
FROM alpine:latest

使 layers 减到最少

Docker 镜像由多个 layers 组成,每一层都会带来额外的开销。
最少的 layers 有助于减小镜像大小并加快部署速度
。将相关命令分组到单个 RUN 指令中,并使用多阶段构建将构建依赖项与最终镜像分开。这确保了生产镜像中只包含必要的工件。

# Multi-stage build example
# Build stage
FROM node:14 as build
WORKDIR /app
COPY . .
RUN npm install
RUN npm run build
 
# Production stage
FROM nginx:alpine
COPY --from=build /app/dist /usr/share/nginx/html

使用 .dockerignore

与 .gitignore 类似,.dockerignore 文件允许你指定要从构建上下文中排除的文件和目录。通过防止不必要的文件添加到镜像中,可以进一步缩小镜像的大小。常见的排除文件包括
node_modules、.git 和临时文件

node_modules
.git
*.log

优化 Dockerfile 指令

注意 Dockerfile 中指令的顺序。将不太可能改变的指令(如安装依赖项)放在开头。
这允许 Docker 在后续构建过程中重复使用缓存层,从而加快进程
。将变化较频繁的指令(如复制应用程序代码)放在文件末尾。

# Reorder instructions for caching benefits
FROM node:14
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .

谨慎更新依赖项

定期更新应用程序依赖项,以利用最新功能、性能改进和安全补丁。不过,要谨慎行事,
彻底测试更新,以避免出现兼容性问题
。Pin 在 Dockerfile 中的版本,以确保开发、测试和生产环境的
一致性

# Pin versions for stability
FROM node:14

实施最佳安全实践

安全是 Docker 镜像管理的一个重要方面。使用 Docker 安全扫描等工具定期扫描镜像以查找漏洞。避免以根用户身份运行容器,并通过为应用程序创建非根用户来遵循最小权限原则。
使用镜像签名并验证基础镜像的完整性,以确保它们未被篡改

# Create a non-root user
RUN adduser -D myuser
USER myuser

优化镜像大小

镜像越小,部署速度越快,资源消耗也越少。删除镜像中不必要的文件、依赖项和工件。考虑使用多阶段构建,将构建工具和依赖项与最终生产镜像分开。使用 Docker Slim 等工具进一步优化镜像大小。

# Remove unnecessary dependencies
RUN apk del .build-deps
 
# Clean up package cache
RUN rm -rf /var/cache/apk/*

将 Docker Compose 用于多容器应用程序

对于具有多个服务的应用程序,Docker Compose 可简化容器的协调工作。在 docker-compose.yml 文件中定义服务、网络和卷。这样可以简化复杂应用的部署和管理,促进开发、测试和生产环境的一致性。

下面是 docker-compose.yml 的示例:

version: '3'
services:
  web:
    build: .
    ports:
      - "80:80"
  db:
    image: postgres:latest

使用 CI/CD 自动构建镜像

将持续集成/持续部署(CI/CD)流水线纳入您的开发工作流程。
自动构建、测试和部署 Docker 镜像,以确保一致性和可靠性
。可以集成 Jenkins、GitLab CI 和 GitHub Actions 等工具,以便在向存储库推送变更时触发镜像构建。

监控和优化运行时性能

定期监控生产中容器化应用程序的性能。使
用 Prometheus、Grafana 或 Docker 本机监控功能等工具收集指标并找出性能瓶颈
。优化容器资源分配,调整配置参数,并根据实时数据做出明智决策,以确保最佳性能。

结论

优化 Docker 镜像部署是一个持续的过程,需要在开发和部署的每个阶段做出明智的选择。通过遵循这些最佳实践,您可以创建高效、安全和可管理的 Docker 镜像,从而促进无缝和可扩展的容器化应用环境。紧跟行业趋势,探索新工具,抱着持续改进的心态,让您的 Docker 化应用程序始终走在现代软件开发的前沿。

本文分享自华为云社区《
如何在Docker容器启动时自动运行脚本
》,作者: 皮牙子抓饭。

如何在Docker容器启动时自动运行脚本

在使用Docker构建应用程序时,有时我们希望在启动Docker容器时自动执行一些脚本,以初始化应用程序或执行一些必要的操作。本文将介绍如何在Docker容器启动时自动运行脚本的方法。

1. 创建启动脚本

首先,我们需要编写一个启动脚本,该脚本包含我们想要在容器启动时执行的命令。假设我们的启动脚本名为startup.sh,内容如下:

bashCopy code
#
!/bin/bash
# 在这里编写需要在容器启动时执行的命令
echo
"容器启动成功,开始执行初始化操作..."# 执行其他操作,例如启动应用程序、初始化数据库等

确保在脚本中包含所需的操作命令,并在脚本文件的开头指定解释器,如#!/bin/bash。

2. 将脚本复制到Docker镜像中

在Dockerfile中,通过COPY命令将启动脚本复制到容器中的指定位置。假设我们将启动脚本放在Docker容器的/usr/src/app目录下,Dockerfile中的相应部分如下:

DockerfileCopy code
...
COPY startup.sh
/usr/src/app/...

确保启动脚本与Dockerfile在同一目录中,或者根据实际情况调整COPY命令的路径。

3. 在Dockerfile中定义启动命令

在Dockerfile中,使用CMD或ENTRYPOINT指令来指定在容器启动时运行的脚本。以下是一种常用的方式:

DockerfileCopy code
...
COPY startup.sh
/usr/src/app/CMD ["/bin/bash", "/usr/src/app/startup.sh"]
...

在上面的例子中,我们使用CMD指令指定在容器启动时执行startup.sh脚本。根据需要选择CMD或ENTRYPOINT指令。

4. 构建Docker镜像并运行容器

接下来,使用docker build命令构建Docker镜像,并使用docker run命令运行容器。容器启动时将自动执行startup.sh脚本中定义的操作。

bashCopy code
docker build
-t my-image .
docker run
-d my-image

通过以上步骤,我们成功实现了在Docker容器启动时自动运行脚本的目的。在实际应用中,可以根据需求编写不同的启动脚本,实现自定义的初始化操作或其他必要的任务。 希望本文对您了解如何在Docker容器启动时自动运行脚本提供了帮助。祝您使用Docker构建应用程序顺利!

在Docker容器启动时执行一些初始化操作,比如配置环境变量、启动后台服务等。以下是一个示例代码,演示如何在Docker容器启动时自动运行脚本来启动一个Node.js Express应用。

1. 创建启动脚本 startup.sh

首先,我们创建一个启动脚本 startup.sh,用于启动Node.js Express应用。脚本内容如下:

bashCopy code
#
!/bin/bash
# 进入应用程序目录
cd
/usr/src/app
# 安装依赖
npm install
# 启动Node.js Express应用
node server.js

2. 创建 Node.js Express 应用

接下来,我们创建一个简单的Node.js Express应用,假设应用代码如下:

javascriptCopy code//server.js
const express = require('express');const app =express();const port = 3000;
app.
get('/', (req, res) =>{
res.send(
'Hello, Docker!');
});
app.listen(port, ()
=>{
console.log(`App listening at http:
//localhost:${port}`); });

3. 编写 Dockerfile

然后,编写一个Dockerfile,将启动脚本 startup.sh 复制到Docker容器中,并指定在容器启动时执行该脚本。

DockerfileCopy code
# 使用Node.js镜像作为基础镜像
FROM node:
14# 创建工作目录
WORKDIR
/usr/src/app
# 复制应用程序文件
COPY package.json server.js
/usr/src/app/# 复制启动脚本
COPY startup.sh
/usr/src/app/# 安装Node.js依赖
RUN npm install
# 指定容器启动时执行的命令
CMD [
"bash", "./startup.sh"]

4. 构建Docker镜像并运行容器

接下来,使用以下命令构建Docker镜像并运行容器:

bashCopy code
docker build
-t my-node-app .
docker run
-dp 3000:3000 my-node-app

现在,当您运行上述命令后,Docker容器将自动启动Node.js Express应用,并在浏览器中访问 http://localhost:3000 即可查看应用程序输出的 Hello, Docker!。 通过以上示例,您可以实现在Docker容器启动时自动运行脚本的需求,用于初始化应用程序或执行其他必要的操作。希望这个示例对您有所帮助!

Docker脚本详解

Docker脚本是一种用于在Docker容器中执行的脚本文件,通常用于在容器启动时执行特定的操作,如初始化应用程序、配置环境变量、启动服务等。下面将详细介绍有关Docker脚本的相关内容。

1. Docker容器中的脚本类型

在Docker容器中可以使用多种类型的脚本文件,其中一些常见的包括:

  • Shell脚本(.sh文件):以.sh为扩展名的Shell脚本文件,可以使用bash、sh等shell解释器执行命令。
  • Python脚本(.py文件):以.py为扩展名的Python脚本文件,可以使用Python解释器执行脚本。
  • Node.js脚本(.js文件):以.js为扩展名的Node.js脚本文件,可以使用Node.js解释器执行脚本。 根据需要选择合适的脚本类型,以实现在Docker容器启动时期望的操作。

2. 编写Docker脚本的步骤

a. 创建脚本文件:首先,根据需要编写脚本文件,包括实现在容器启动时期望执行的操作。

b. 复制脚本文件:在Dockerfile中使用COPY指令将脚本文件复制到Docker容器中。确保文件被正确复制到容器中的指定目录。

c. 指定启动命令:使用CMD或ENTRYPOINT指令在Dockerfile中指定在容器启动时执行脚本文件的命令。

3. 示例

下面是一个简单的Docker脚本示例,演示如何编写和使用Shell脚本来在容器启动时输出一条欢迎消息:

创建Shell脚本文件 welcome.sh

bashCopy code
#
!/bin/bash
echo
"Welcome to Docker Container!"

编写Dockerfile

DockerfileCopy code
FROM ubuntu:
20.04COPY welcome.sh/usr/src/app/CMD ["/bin/bash", "/usr/src/app/welcome.sh"]

构建Docker镜像并运行容器

bashCopy code
docker build
-t my-welcome-app .
docker run my
-welcome-app

以上示例中,当您运行构建的Docker容器时,将会自动执行welcome.sh脚本文件,输出欢迎消息"Welcome to Docker Container!"。

点击关注,第一时间了解华为云新鲜技术~

就在昨晚,Java 22正式发布!该版本提供了 12 项功能增强,其中包括 7 项预览功能和 1 项孵化器功能。它们涵盖了对 Java 语言、API、性能以及 JDK 中包含的工具的改进。

下面就来一起学习一下该版本都更新了哪些新特性!

Unnamed Variables & Patterns - JEP 456

JEP 456 - 未命名变量和模式:当需要但未使用变量声明或嵌套模式时,提高了可读性。两者都由下划线字符表示。

价值

  • 捕获开发人员的意图,即未使用给定的绑定或 lambda 参数,并强制执行该属性以澄清程序并减少出错的机会。
  • 通过识别必须声明(例如,在 catch 子句中)但未使用的变量,提高所有代码的可维护性。
  • 允许多个模式出现在单个 case 标签中,如果它们都没有声明任何模式变量。
  • 通过消除不必要的嵌套类型模式来提高记录模式的可读性。

Statements before super (…) [Preview] - JEP 447

在构造函数中,允许不引用正在创建的实例的语句出现在显式构造函数调用之前。

价值

  • 为开发人员提供了更大的自由来表达构造函数的行为,从而可以更自然地放置目前必须纳入辅助静态方法、辅助中间构造函数或构造函数参数中的逻辑。
  • 保留构造函数在类实例化期间按自上而下顺序运行的现有保证,确保子类构造函数中的代码不会干扰超类实例化。
  • 不需要对 Java 虚拟机进行任何更改。此 Java 语言功能仅依赖于 JVM 验证和执行构造函数中显式构造函数调用之前出现的代码的当前能力。

String Templates (2nd Preview) - JEP 459

字符串模版的第2个预览版,关于该功能之前DD给大家介绍过,更多细节可以看看之前的这篇文章
String Templates(字符串模版)

价值

  • 通过轻松表达包含运行时计算值的字符串,简化了 Java 程序的编写。
  • 增强混合文本和表达式的表达式的可读性,无论文本适合单个源行(如字符串文字)还是跨越多个源行(如文本块)。
  • 通过支持模板及其嵌入表达式的值的验证和转换,提高 Java 程序的安全性,这些程序从用户提供的值组成字符串并将其传递到其他系统(例如,构建数据库查询)。
  • 通过允许 Java 库定义字符串模板中使用的格式化语法来保留灵活性。
  • 简化了接受非 Java 语言(例如 SQL、XML 和 JSON)编写的字符串的 API 的使用。
  • 允许创建根据文字文本和嵌入表达式计算的非字符串值,而无需通过中间字符串表示形式进行传输。

Implicitly Declared Classes and Instance Main Methods (2nd Preview) - JEP 463

隐式声明的类和实例主要方法(2nd 预览)- JEP 463

学生可以编写他们的第一个 Java 程序,而无需了解为大型程序设计的语言功能。学生无需使用单独的语言方言,而是可以为单类程序编写简化的声明,然后随着技能的增长无缝扩展他们的程序以使用更高级的功能。关于该特性,之前DD也介绍过,更多细节可见这篇文章
未命名类和实例的Main方法

价值

  • 加速 Java 学习
  • 为 Java 编程提供了一个平滑的入门通道,以便教师可以循序渐进地介绍概念。
  • 帮助学生以简洁的方式编写基本程序,并随着他们的技能增长而优雅地扩展他们的代码。
  • 减少编写简单程序(例如:脚本和命令行实用程序)的方式。
  • 不引入单独的初学者工具链;学生程序应该使用与编译和运行任何 Java 程序相同的工具来编译和运行。

Foreign Function & Memory API - JEP 454

外部函数和内存 API - JEP 454

允许 Java 程序与 Java 运行时之外的代码和数据进行互操作。通过有效地调用外部函数(即 JVM 外部的代码),并安全地访问外部内存(即不受 JVM 管理的内存),API 使 Java 程序能够调用本机库并处理本机数据,而不会出现脆弱性和危险。 JNI。

价值

  • 生产力:用简洁、可读且纯 Java API 取代脆弱的本机方法和 Java 本机接口 (JNI)。
  • 性能:提供对外部函数和内存的访问,其开销与 JNI 和 sun.misc.Unsafe 相当(如果不是更好的话)。
  • 广泛的平台支持:允许在 JVM 运行的每个平台上发现和调用本机库。
  • 一致性:提供在多种内存(例如本机内存、持久内存和托管堆内存)中操作无限大小的结构化和非结构化数据的方法。
  • 健全性:保证没有释放后使用错误,即使在多个线程之间分配和释放内存时也是如此。
  • 完整性:允许程序使用本机代码和数据执行不安全的操作,但默认警告用户此类操作。

Class-File API (Preview) - JEP 457

类文件 API(预览版)- JEP 457,提供用于解析、生成和转换 Java 类文件的标准 API。

价值

  • 该API允许依赖它的框架和程序自动支持最新JDK中的最新类文件,以便可以快速、轻松地采用以类文件表示的新语言和VM功能。

Stream Gatherers (Preview) - JEP 461

Stream Gatherers(预览版)- JEP 461,增强了 Stream API 以支持自定义中间操作。这将允许流管道以现有内置中间操作不易实现的方式转换数据。

价值

  • 通过使流中的常见自定义操作更加灵活和富有表现力,提高开发人员的工作效率和代码可读性。尽可能允许中间操作操作无限大小的流。

Structured Concurrency (2nd Preview) - JEP 462

结构化并发(2nd 预览版)- JEP 462,简化并发编程。结构化并发将在不同线程中运行的相关任务组视为单个工作单元,从而简化错误处理和取消、提高可靠性并增强可观察性。

价值

  • 通过推广一种编程风格来简化并发代码的开发,这种编程风格可以消除因取消和关闭而产生的常见风险(例如线程泄漏和取消延迟),并提高并发代码的可观察性。

Scoped Values (2nd Preview) - JEP 464

范围值(2nd 预览)- JEP 464,实现线程内和线程间不可变数据的高效共享。

价值

  • 易于使用 - 提供一个编程模型来在线程内以及与子线程共享数据,以简化有关数据流的推理。
  • 可理解性——使共享数据的生命周期从代码的语法结构中可见。
  • 鲁棒性——确保调用者共享的数据只能由合法的被调用者检索。
  • 性能——将共享数据视为不可变,以允许大量线程共享,并实现运行时优化。

Vector API (7th Incubator) - JEP 460

矢量 API(7th 孵化器)- JEP 460,一个用于表达向量计算的 API,可在运行时可靠地在支持的 CPU 架构上编译为最佳向量指令,从而实现优于等效标量计算的性能。此 JEP 建议在 JDK 22 中重新孵化该 API,相对于JDK 21。该实现包括错误修复和性能增强。我们包括以下显着变化:

  • 支持使用任何原始元素类型的数组支持的堆 MemorySegments 进行向量访问。以前的访问仅限于由字节数组支持的堆 MemorySegment。

价值

  • 提供清晰简洁的 API,能够清晰简洁地表达各种向量计算,这些向量计算由循环内组成的向量运算序列组成,并且可能还包含控制流。
  • 该 API 设计为与 CPU 架构无关,可在支持向量指令的多种架构上实现。
  • 在 x64 和 AArch64 架构上提供可靠的运行时编译和性能。

Regional Pinning for G1 - JEP 423

G1 的区域固定 - JEP 423,通过在 G1 中实现区域固定来减少延迟,以便在 Java 本机接口 (JNI) 关键区域期间无需禁用垃圾收集。

价值

  • 使用 JNI 时,Java 线程无需在 G1 GC 操作完成之前等待,从而提高开发人员的工作效率。

Launch Multi-File Source-Code Programs - JEP 458

启动多文件源代码程序 - JEP 458,允许用户运行作为多个 Java 源代码文件提供的程序,而无需先进行编译。

价值

  • 通过使从小程序到大型程序的过渡更加渐进,提高开发人员的工作效率,使开发人员能够选择是否以及何时配置构建工具。
  • 请注意,预览功能已完全指定并完全实现了 Java SE 平台的语言或 VM 功能,但它们是暂时的。它们在 JDK 功能版本中提供,以便开发人员根据实际使用情况提供反馈,然后再在未来版本中永久保留。这也为工具供应商提供了在最终确定为 Java SE 标准之前致力于支持功能的机会。
  • 孵化器模块中的 API 将非最终 API 和非最终工具交给开发人员和用户,以收集反馈,最终提高 Java 平台的质量。
  • 除了 JEP 中描述的更改之外,发行说明中还列出了许多较小的更新,许多应用程序开发人员和系统管理员都会对此感兴趣。其中包括弃用过时的 API 和删除以前弃用的 API。

其他更新

Java 22 发行说明中还有​​一些其他关键更新:

  • 向 keytool 和 jarsigner 添加附加算法。
  • 垃圾收集器吞吐量的提高,尤其是与“年轻”垃圾相关的情况。
  • 更好的系统模块描述符版本报告。
  • 改进了本机代码的“wait”处理选项。
  • Unicode 通用区域设置数据存储库已更新至版本 44。
  • 类型注释支持从字节码加载的类型。
  • ForkJoinPool 和 ForJoinTasks 现在可以更好地处理不间断任务。
  • 配置客户端与服务器 TLS 连接属性的额外灵活性。
  • 改进了本机内存跟踪,包括报告峰值使用情况的能力

最后注意:JDK 22 是通过六个月的发布节奏按时交付的 13th 功能版本。由于预期改进源源不断,这种程度的可预测性使开发人员能够轻松管理创新的采用。Oracle 不会为 JDK 22 提供长期支持,在 2023 年 9 月之前提供更新,之后它将被 Oracle JDK 23 取代。最近的长期维护版本是Java 21,更多关于Java新特性的解读和学习欢迎关注
《Java 新特性解读》

欢迎关注我的公众号:程序猿DD。第一时间了解前沿行业消息、分享深度技术干货、获取优质学习资源