我正在尝试将现有的命令行应用程序迁移到 Spring boot,但遇到了一个奇怪的问题。
该应用程序可以运行,但启动时似乎很慢
mvn spring-boot:run
并不是应用程序启动慢。有一种方法应该从数据库中获取大约 1.8 Mio 记录并从结果集中创建 POJO。 通常这最多需要 40 秒。
使用 Maven 启动应用程序需要 > 5 分钟。
如果我用java -jar app.jar
启动它,它工作得很好/很快。
在 IntelliJ 中启动应用程序时速度也很快。
我猜测这可能与类路径有关,但这只是一个猜测。
我在应用程序中所做的就是将一些 Singelton 类迁移到 @Components 并添加 spring-boot-maven-插件
有什么想法吗?
最佳答案
发现问题:
TLDR:使用 spring boot 2.7 和(不支持的)Java 17
希望这对某人有帮助:
- 我要迁移的应用使用的是 Java 17。
- Spring boot 2.x 不支持 Java 17。
实际上,我通过像这样配置 Maven 插件来使其与 Java 17 兼容:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<optimizedLaunch>false</optimizedLaunch>
</configuration>
</plugin>
通过设置optimizedLaunch=false,插件将忽略传递给 JVM 的 -XX:TieredStopAtLevel=1
标志,这似乎是导致问题的原因。
示例:
慢:
/Library/Java/JavaVirtualMachines/temurin-17.jdk/Contents/Home/bin/java -XX:TieredStopAtLevel=1 -cp A_LOT_OF_DEPS_HERE com.myapp.SpringApp
快速(无-XX:TieredStopAtLevel=1
):
/Library/Java/JavaVirtualMachines/temurin-17.jdk/Contents/Home/bin/java -cp A_LOT_OF_DEPS_HERE com.myapp.SpringApp
我仍然不明白的是为什么代码在某些模式匹配(在我的代码中)时如此慢(spring-boot:run
),但在使用 运行时并不慢java(17) -jar my-app.jar
)
无论如何,一如既往,键盘后面的设备的故障(那就是我)
关于java - mvn spring-boot :run slow compared to java -jar xxx. jar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74534018/