Efficient Deployments
-
默认情况下,基于SpringBoot框架开发应用时,构建插件
spring-boot-maven-plugin
将项目打包为fat jar。
执行如下命令,解压构建得到的jar文件。java -Djarmode=tools -jar my-app.jar extract
执行如下命令,使用解压后的jar文件,启动SpringBoot应用。
java -jar my-app/my-app.jar
执行如下命令,查看工具的帮助。
java -Djarmode=tools -jar my-app.jar help extract
参考资料
- 深入理解SpringBoot加载FatJar原理
- Maven插件打fatjar的一些技巧
- 打胖瘦jar包的两种方式(idea与maven插件),多图详解
- 啥?你没听过SpringBoot的FatJar?
- maven打包fat-jar注意的问题
- jar的官方文档
- Jar 包签名
CDS
-
Class Data Sharing
CDS是JVM的特性,有助于缩短Java应用的启动时间,并减少内存占用量。java -Djarmode=tools -jar my-app.jar extract --destination application cd application java -XX:ArchiveClassesAtExit=application.jsa -Dspring.context.exit=onRefresh -jar my-app.jar java -XX:SharedArchiveFile=application.jsa -jar my-app.jar
-
Spring CDS
使用CDS时的注意事项:- 创建
application.jsa
时使用的JVM,和运行Java应用加载application.jsa
时使用的的JVM,二者需要保持一致,即版本号、安装路径等需要保持一致。 - Java应用启动时指定的类路径,需要使用jar文件的清单,避免使用目录或者通配符。
- Java应用加载的jar文件,需要保持一致。
- Java应用加载的jar文件的时间戳,需要保持一致。
增加JVM选项
-Xlog:class+load:file=cds.log
,通过检查cds.log
的内容,确认CDS优化的效果。
增加JVM选项-Xshare:on
,确认CDS是否正常启用。 - 创建
官方文档
- Class Data Sharing
- JEP 310: Application Class-Data Sharing
- JEP 350: Dynamic CDS Archives
- Application Class-Data Sharing
- Dynamic CDS Archive
网页的锚点有点问题。
参考资料
AOT
-
Ahead-of-Time Processing With the JVM
AOT和CDS可以同时使用,通过牺牲一部分动态能力,缩短Java应用的启动时间。
mvn -Pnative package java -Dspring.aot.enabled=true -jar myapplication.jar
相关的注解,比如:
@Profile
@Conditional
@ConditionalOnProperty
GraalVM
- GraalVM Native Images
基于GraalVM技术,将Java字节码处理为平台相关的代码,降低内存占用,缩短应用的启动时间。 - Introducing GraalVM Native Images
- Developing Your First GraalVM Native Application
- Native Image Compatibility Guide
Checkpoint and Restore
- Checkpoint and Restore With the JVM
Coordinated Restore at Checkpoint (CRaC) is an OpenJDK project that defines a new Java API to allow you to checkpoint and restore an application on the HotSpot JVM.
- JVM Checkpoint Restore
JVM的启动选项,如下:-XX:CRaCCheckpointTo=PATH
-XX:CRaCRestoreFrom=PATH
参考资料
-
Checkpoint/Restore tool
-
Welcome to CRIU, a project to implement checkpoint/restore functionality for Linux.
Container Images
改进容器的打包方式,分离不变和变的组件,加速容器镜像的构建进程。
对于开发人员来说,有助于缩短构建时的等待时间,提高生产率。