除了GraalVM之外,在最近的Geecon会议上讨论最多的另一项技术是一个名为Java on CRaC的项目。
这个项目带来了两个功能,CRaC上的Java基本上在Oracle GraalVM上运行(目前)。
- 超快的应用程序启动。甚至比GraalVM的本地镜像还要快
- 快照应用的想法允许你立即启动到应用程序的状态,无需数据预热,只是砰的一声!应用程序在启动时就已经加载了所有的东西!
先决条件:
1、Linux machine (in my case):
INFRA [root@payment01 ~]# cat /etc/os-release NAME="Red Hat Enterprise Linux" VERSION="8.6 (Ootpa)"
|
2、Java on CRaC installed as JDK:
INFRA [root@payment01 ~]# java -version openjdk version "17-crac" 2021-09-14 OpenJDK Runtime Environment (build 17-crac+3-15) OpenJDK 64-Bit Server VM (build 17-crac+3-15, mixed mode, sharing)
|
3、maven:
INFRA [root@payment01 ~]# mvn -version Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f) Maven home: /root/apache-maven-3.6.3 Java version: 17-crac, vendor: N/A, runtime: /root/openjdk-17-crac+3_linux-x64 Default locale: en_US, platform encoding: ANSI_X3.4-1968 OS name: "linux", version: "4.18.0-372.32.1.el8_6.x86_64", arch: "amd64", family: "unix"
|
在CRaC上使用Java和Spring Boot的重要提示
要及时对你的应用程序进行CRaC检查点,你必须:
- 关闭你的应用程序打开的所有套接字。
- 关闭你的应用所打开的所有文件
第一个问题解决是使用嵌入式tomcat监听CRaC检查点生命周期:
<dependency> <groupId>io.github.crac.org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-core</artifactId> <version>8.5.75</version> </dependency>
|
官方CRaC spring-boot example 示例中的8.5.78版本不能用于最后的Spring Boot 2.x , 请确保有9.0.58版本。我在含有CRaC的JDK 17上成功测试了Spring Boot 2.6.3。但更高版本的boot应该也可以工作。
CRaC和LINUX平台问题
我在提到的RED_HAT linux上运行Java CRaC的经验最好。在Oracle LINUX上运行CRaC是非常痛苦的。
总之,在这两种情况下,我不得不采用以下的解决方法来创建应用程序检查点。
MVC app for testing
@RestController public class TestController {
IDataService dataService;
public TestController(IDataService dataService) { this.dataService = dataService; }
@GetMapping("/addData/{data}") public String addData(@PathVariable("data") String data) { dataService.addData(data);
return data+" added."; }
@GetMapping("/getData") public String getData() { return dataService.getData(); } }
|
IDataService在内存中保存数据。
总结
CRaC上的Java击败Oracle GraaVM的地方
- 与GraalVM相比,应用程序的启动速度甚至更快
- 基于反射的框架对应用程序的快照来说不是问题。GraalVM在这一点上很纠结
- GraalVM不允许你像CRaC那样及时从状态中启动应用程序。
Oracle GraaVM在CRaC上击败Java的地方
- 1000倍好的文档!
- GraalVM的本地镜像比基于CRaC的应用程序少消耗5倍的内存。当内存是你的首要任务时,请选择GraalVM。
源码案例点击标题