import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.RestController;@RestController@RequestMapping("/greetings")public class GreetingsController { @GetMapping public String greeting(@RequestParam(required = false) String name) { return "Hello %s!".formatted(name == null ? "World" : name); }}
这个 Java 类处理 GET 请求,/greetings如果提供了参数则返回“Hello [name]” name,如果没有提供则返回“Hello World
”创建 MemoryUsageLogger 类在com.example.GreetingsApp包中,让我们创建MemoryUsageLogger具有以下内容的类:
import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.boot.ApplicationArguments;import org.springframework.boot.ApplicationRunner;import org.springframework.stereotype.Component;@Componentpublic class MemoryUsageLogger implements ApplicationRunner { private static final Logger logger = LoggerFactory.getLogger(MemoryUsageLogger.class); @Override public void run(ApplicationArguments args) { Runtime runtime = Runtime.getRuntime(); long memoryUsedBytes = runtime.totalMemory() - runtime.freeMemory(); long memoryUsedMB = memoryUsedBytes / (1024 1024); logger.info("Memory footprint at startup: {} MB", memoryUsedMB); }}
此 Java 类记录启动时的内存使用情况当应用程序启动时,它会计算已用内存并使用 SLF4J 记录生成 Uber JAR在终端和 GreetingsApp 根文件夹中,运行以下命令来打包 Uber JAR:./mvnw clean package -DskipTests
该GreetingsApp-0.0.1-SNAPSHOT.jar文件将在目标中生成folder生成 CDS 友好布局在终端和 GreetingsApp 根文件夹中,运行以下命令来生成 CDS 友好布局:java -Djarmode=tools -jar target/GreetingsApp-0.0.1-SNAPSHOT.jar extract
将会创建一个名为的文件夹GreetingsApp-0.0.1-SNAPSHOT其中,我们将包含GreetingsApp-0.0.1-SNAPSHOT.jar文件(我们将其称为CDS JAR)和lib包含所有所需库的文件夹启动 5 次 Uber JAR在终端的 GreetingsApp 根文件夹中,运行以下命令来启动该应用程序按Ctrl+C关闭它,并重复此过程五次:java -jar target/GreetingsApp-0.0.1-SNAPSHOT.jar以下是我们进行的 5 次执行的结果(为简洁起见,省略了一些日志行)::: Spring Boot :: (v3.3.0) ... 2024-05-26T10:37:22.651+02:00 INFO 99104 --- [GreetingsApp] [ main] ceGGreetingsAppApplication :在 2.401 秒内启动 GreetingsAppApplication(进程运行 2.984 秒)2024-05-26T10:37:22.655+02:00 INFO 99104 --- [GreetingsApp] [ main] ceGreetingsApp.MemoryUsageLogger :启动时的内存占用:14 MB ^C%
在 CDS 友好布局中启动 5x JAR在终端的 GreetingsApp 根文件夹中,运行以下命令来启动该应用程序按Ctrl+C关闭它,并重复此过程五次:java -jar GreetingsApp-0.0.1-SNAPSHOT/GreetingsApp-0.0.1-SNAPSHOT.jar
以下是我们进行的 5 次执行的结果(为简洁起见,省略了一些日志行)::: Spring Boot :: (v3.3.0) ... 2024-05-26T10:41:57.459+02:00 INFO 99303 --- [GreetingsApp] [ main] ceGGreetingsAppApplication : 在 1.947 秒内启动 GreetingsAppApplication(进程运行了 2.275 秒)2024-05-26T10:41:57.462+02:00 INFO 99303 --- [GreetingsApp] [ main] ceGreetingsApp.MemoryUsageLogger : 启动时的内存占用:18 MB ^C%
比较:Uber JAR 与 CDS JAR下表显示了上述执行获得的启动时间和内存占用:JAR 类型|启动时间(秒) |启动时的内存占用(MB) | -------- + ------------------- + -------------------------------- | Uber JAR | 2.369 | 19 | Uber JAR | 2.389 | 19 | Uber JAR | 2.359 | 33 | Uber JAR | 2.401 | 14 | Uber JAR | 2.425 | 19 | ........ + ................... + ................................ | CDS JAR | 1.947 | 18 | CDS JAR | 2.032 | 14 | CDS JAR | 1.953 | 16 | CDS JAR | 1.908 | 17 | CDS JAR | 1.940 | 18 |
平均值为:JAR 类型|平均启动时间(秒) |启动时平均内存占用(MB) | -------- + ----------------------- + ------------------------------------ | Uber JAR | 2.388 | 20.8 | ........ + ......................... + .................................... | CDS JAR | 1.956 | 16.6 |
从平均值表中我们可以看出:CDS JAR 的启动时间比 Uber JAR 快约18.09%此外,内存占用也减少了约20.19%结论在本文中,我们创建了一个名为 GreetingsApp 的简单 Java Web Spring Boot 应用程序,以探索类数据共享 (CDS) 的好处通过比较标准 Uber JAR 与 CDS JAR 的启动时间和内存占用,我们展示了 CDS 如何增强 Java 应用程序结果表明,使用 CDS 可显著缩短启动时间和减少内存占用,缩短约 20%,使其成为优化 Java 应用程序的宝贵功能Java 有一些改进,特别是GraalVM和CRaC在 CDS、GraalVM 和 CRaC 之间做出选择时,重要的是要考虑它们的准备情况和易用性虽然 GraalVM 和本机构建很有前景,但它们可能尚未完全准备好用于生产另一方面,CDS 已经成熟且易于实现,使其成为优化 Java 应用程序的启动时间和内存使用情况的可靠选择(图片来源网络,侵删)
0 评论