概念篇

1、从JDK8->JDK17 你需求知道的

从 JDK 8 晋级到 JDK 17 能够让你的使用程序获益于新的功用、功能改善和安全增强。下面是一些 JDK 8 晋级到 JDK 17 的最佳实战:

1.1、确认晋级的必要性:首要,你需求评估你的使用程序是否需求晋级到 JDK 17。查看 JDK 17 的新特性、改善和修复的 bug,以确认它们对你的使用程序是否有实践的优点。

1.2、了解 JDK 8 到 JDK 17 的改变:详细了解 JDK 8 和 JDK 17 之间的差异是非常重要的。熟悉 JDK 17 中引进的新特性、移除的特性以及或许影响现有代码的改变。

1.3、处理向后不兼容的改变 更新依靠项和结构:在晋级过程中,或许会遇到一些向后不兼容和结构不兼容的改变。例如,一些 API 的运用方式或许发生了改变,或许一些办法已被废弃。在晋级之前,你需求对这些改变进行细心的查看,并相应地修正你的代码。

1.4、进行兼容性测验:在晋级之前,进行兼容性测验是非常重要的。保证你的使用程序在 JDK 17 下能够正常运转,而且没有呈现任何功能下降或功用问题。能够运用自动化测验东西来简化测验过程。

1.5、逐渐晋级:关于大型使用程序或关键体系,主张逐渐进行晋级。能够先将使用程序搬迁到较新的 JDK 版别,如 JDK 11 或 JDK 14,然后再逐渐晋级到 JDK 17。这样能够下降晋级过程中的风险,并使你能够逐渐处理遇到的问题。

1.6、监控和优化功能:晋级到 JDK 17 后,你或许会注意到一些功能改善。但是,某些代码或许会受到影响并表现出不同的行为。运用功能监控东西来检测潜在的功能问题,并进行必要的调整和优化。

1.7、 更新部署和运维流程:晋级 JDK 版别后,你或许还需求更新你的部署和运维流程。例如,JDK 17 中引进了一些新的指令行东西和管理选项

2、为什么要运用jdk17?

2.1、长期支撑(LTS):JDK 版别中的一些版别被标记为长期支撑版别,这意味着它们将取得更长时刻的支撑和保护。JDK 17 是 OpenJDK 的一个 LTS 版别

2.2、生态体系支撑:一些开源项目、结构和东西或许会更早地支撑较新的 JDK 版别,以运用新的特性和改善。挑选较新的 JDK 版别能够使你能够运用最新的东西和库,并取得更好的生态体系支撑

2.3、新功用和改善:每个 JDK 版别都会引进新的功用、增强和改善

3、强强联合GraalVM

GraalVM 是一种开源的 通用 虚拟机(通用: 它具有支撑多种编程言语的能力 直接在 graalvm运转 不需求额外的运转时环境),具有许多特性和优势,使得它在特定的场景中成为一个有吸引力的挑选。以下是一些运用 GraalVM 的原因:

3.1、高功能:GraalVM 具有优化的即时编译器,能够将 Java 程序编译成高效的机器码。在许多情况下比传统的 Java 虚拟机更快。

3.2、AOT 编译:GraalVM 能够将 Java 程序静态编译成本地机器码,这被称为 Ahead-of-Time(AOT)编译。AOT 编译能够供给更快的发动时刻和更低的内存耗费,适用于一些对功能要求较高的场景。

3.3、生态体系支撑:GraalVM 在开发者社区中有广泛的支撑和活跃的生态体系。许多开源项目和结构现已对 GraalVM 进行了优化和集成,使得运用 GraalVM 更加便利和无缝

3.4、嵌入式支撑:GraalVM 供给了嵌入式 API,允许你将 GraalVM 作为库集成到你的使用程序中。这意味着你能够将 GraalVM 作为运转时引擎嵌入到你的使用程序中,从而实现更高的灵活性和自定义性。

3.5、云原生支撑:GraalVM 具有与云原生使用程序开发和部署相关的特性。它能够与 Docker 和 Kubernetes 合作运用,支撑快速发动和低内存耗费,适用于云环境中的微服务架构。

实战篇

1、第一步主张先晋级依靠项

假如你的项目根据java 8,在晋级前最好先晋级依靠项,从java 8晋级到java 17是一个很大的跨越,依靠项不晋级则出问题的概率会比较高,maven能够用mvn versions:display-dependency-updates指令查看依靠项更新,输出会类似这样

轻量灵动: 革新轻量级服务开发 | 京东云技术团队

然后能够把依靠项晋级到输出的对应版别,大部分包晋级不会出问题,假如有问题,主张去出问题的依靠官方库房寻觅处理方案。这个指令是直接查询maven长途库房,假如依靠项多的话会运转比较长的时刻

或许 jdeps –jdk-internals –multi-release 17 –class-path . encloud-api.jar

javax.annotation.*被移除 能够手动倒入

dependency>
    <groupId>javax.annotation</groupId>
    <artifactId>javax.annotation-api</artifactId>
</dependency>

常见的标记为废弃的参数 搬迁前后的参数如下:

轻量灵动: 革新轻量级服务开发 | 京东云技术团队

2、环境装置

2.1、Jdk环境装置 www.graalvm.org/downloads/

版别比照

轻量灵动: 革新轻量级服务开发 | 京东云技术团队

晋级时springboot和springcloud版别对应表 start.spring.io/actuator/in…

2.2、maven环境装置

maven.apache.org/download.cg…

GraalVM对maven没有特定的版别要求。通常情况下,只要您运用的Maven版别满足新并支撑Java 8或更高版别,就能够与GraalVM一同运用。主张您运用Maven 3.5.x 或更高版别以保证与GraalVM的兼容性

发动java器运用 GraalVM 默许编译器 Graal 运转 JVM。装置时查看Java版别:

$JAVA_HOME/bin/java -version

3、二进制的生成

3.1、装置本机映像

gu install native-image
该native-image东西装置在$JAVA_HOME/bin目录中

3.2、maven构建

mvn clean package -Pnative -Dmaven.test.skip=true

4、呈现的坑点

4.1、关于mac 提早装置 glibc-devel

4.2、关于 centos 提早装置

yum install centos-release-scl

yum install devtoolset-8

source /opt/rh/devtoolset-8/enable

yum install zlib-devel

否则编译呈现 会编译失败 gcc需求晋级到6.4以上

轻量灵动: 革新轻量级服务开发 | 京东云技术团队

轻量灵动: 革新轻量级服务开发 | 京东云技术团队

4.3、关于java 使用来说 打出来的二进制或许呈现乱码 因而需求强制指定

轻量灵动: 革新轻量级服务开发 | 京东云技术团队

5、模块化 初体验

 git clone https://github.com/graalvm/graalvm-demos
 cd graalvm-demos/native-hello-module
 结构图
 ├── hello
│   └── Main.java
│       > package hello;
│       > 
│       > public class Main {
│       >     public static void main(String[] args) {
│       >         System.out.println("Hello from Java Module: "
│       >             + Main.class.getModule().getName());
│       >     }
│       > }
│
└── module-info.java
    > module HelloModule {
    >     exports hello;
    > }
 mvn package
 $JAVA_HOME/bin/java --module-path target/HelloModule-1.0-SNAPSHOT.jar --module HelloModule
 $JAVA_HOME/bin/native-image --module-path target/HelloModule-1.0-SNAPSHOT.jar --module HelloModule
 ./hellomodule

6、编译器操作形式

Graal 作为 HotSpot JIT 编译器有两种运转形式: libgraal:Graal 编译器提早编译到本地同享库中。在这种运转形式下,同享库由 HotSpot VM 加载。编译器运用与 HotSpot 堆分隔的内存,而且从一开端就运转得很快,由于它不需求预热。这是默许和引荐的操作形式。

jargraal:Graal 编译器经历与 Java 使用程序的其余部分相同的预热阶段。也就是说,在编译其热办法之前首要对其进行解说。-XX:-UseJVMCINativeLibrary运用指令行选项挑选此形式。这将延迟到达最佳功能的时刻。

7、本机映像构建装备

maven常用装备
<buildArgs>
假如要将其他参数传递给本机图画生成器,请<buildArgs> 在插件的装备中运用
<buildArgs>
    <arg>--argument</arg>
</buildArgs>
<skipNativeBuild>
要越过本机图画的生成,请在插件的装备中供给以下内容:
<skipNativeBuild>true</skipNativeBuild>
<skipNativeTests>
要越过本机图画编译测验的生成和履行,请在插件的装备中供给以下内容:
<skipNativeTests>true</skipNativeTests>
<debug>
假如要启用调试信息的生成,请在插件装备中供给以下内容:
<debug>true</debug>
<useArgFile>
假如要运用参数文件构建原生图画,请在插件装备中供给以下内容:
<useArgFile>true</useArgFile>

8、日志记载添加到本机可履行文件

1、默许情况下,由 Native Image 生成的本机可履行文件支撑经过java.util.logging.*API 进行日志记载。

2、本机可履行文件中的默许日志记载装备根据logging.properties在 JDK 中找到的文件。该文件装备了一个java.util.logging.ConsoleHandler只显示该INFO等级及以上等级的消息的文件,假如您需求额外的日志记载处理程序,则有必要注册相应的类以进行反射。例如,假如您运用java.util.logging.FileHandlerthen 供给以下反射装备:

{
    "name" : "java.util.logging.FileHandler",
    "methods" : [
      { "name" : "<init>", "parameterTypes" : [] },
    ]
  }

3、将以下 Java 代码保存到名为LoggerRunTimeInit.java的文件中,然后运用以下指令对其进行编译javac

import java.io.IOException;
 import java.util.logging.Level;
 import java.util.logging.LogManager;
 import java.util.logging.Logger;
 public class LoggerTest {
     public static void main(String[] args) throws IOException {
         LogManager.getLogManager().readConfiguration(LoggerRunTimeInit.class.getResourceAsStream("/logging.properties"));
         Logger logger = Logger.getLogger(LoggerRunTimeInit.class.getName());
         logger.log(Level.WARNING");
     }
 }



4、下载logging.properties资源文件 ( www.graalvm.org/docs/refere… )并将其保存在与LoggerRunTimeInit.java相同的目录中。

5、构建并运转本机可履行文件

 native-image LoggerTest -H:IncludeResources="logging.properties"
  ./LoggerTest

6、它应该发生类似于以下内容的输出:

 WARNING

9、运用jdk17和graalvm 你能够体验到:

1.发动时刻:GraalVM 供给了 Just-In-Time (JIT) 编译和 Ahead-Of-Time (AOT) 编译的能力。AOT 编译能够将 Java 使用程序编译成本地机器码,从而加快使用程序的发动时刻。相比之下,传统的 JIT 编译需求一些发动时刻来进行动态编译。因而,运用 GraalVM 的 AOT 编译或许会显著减少发动时刻,进步使用程序的响应功能。

2.内存占用:GraalVM 的 AOT 编译能够减少使用程序的内存占用,由于本地机器码通常比解说履行的字节码更加紧凑。这能够进步使用程序的可扩展性和资源运用率。

3.即时编译功能:GraalVM 的 JIT 编译器在某些情况下或许会供给更好的功能。它能够对热门代码进行更优化的编译,以进步履行速度。这或许在一些计算密集型任务或高并发场景中带来功能提升。

4.使用自身巨细:在实在环境下占用比照 且二进制版别是现已整合5个项目的完好项目 而jar仅仅其中1/5

轻量灵动: 革新轻量级服务开发 | 京东云技术团队

10、demo开箱即体验

经过实在项目验证的结构demo已上传至github、地址:kafka-stream 根据JDK17+springboot3.0.6+kafkaStream构成 支撑 native-image打包 让您下的开心 用的舒心 欢迎我们体验

作者:京东科技 徐拥

来历:京东云开发者社区