【问题标题】:mvn spring-boot:run slow compared to java -jar xxx.jarmvn spring-boot:与 java -jar xxx.jar 相比运行缓慢
【发布时间】:2022-11-23 00:01:48
【问题描述】:

我正在尝试将现有的命令行应用程序迁移到 Spring Boot,但我遇到了一个奇怪的问题。

该应用程序可以运行,但启动时似乎很慢 mvn spring-boot:run

缓慢的不是应用程序启动。有一种方法应该从数据库中获取大约 1.8 Mio 记录并从结果集中创建 POJO。 通常这最多需要 40 秒。

使用 Maven 启动的应用程序需要 > 5 分钟。

如果我以 java -jar app.jar 启动它,它工作得很好/很快。 在 IntelliJ 中启动时,应用程序也很快。

我猜它可能与类路径有关,但这只是一个猜测。

我在应用程序中所做的就是将一些 Singleton 类迁移到 @Components 并添加 spring-boot-maven-插件

有任何想法吗 ?

【问题讨论】:

  • 在这里猜测,但您是否检查了每次启动时使用的内存?我怀疑可能设置了一些不同的 Xmx/Xms 标志
  • @greiker 我在命令行上盯着它看,没有设置-Xmx,所以应该应用默认的 1/4 RAM
  • 只是说它可能是一个检查的地方。可以肯定的是 Intellij f.ex。将设置一些并且插件中可能有一些 ENV 或某些我知道设置它/它们的东西
  • 你在比较苹果和橘子。 mvn spring-boot:run 比运行应用程序做的更多,它会检查、验证依赖项等,因为它是 Maven 构建周期的一部分,所以还有很多事情要做。
  • 我同意,但正如我所说,缓慢的不是构建或启动。代码执行缓慢。即使 Maven 插件将火箭发射到太空,也是 40 秒又是 5 分钟!此外,我见过的数百个 spring 应用程序以前从未发生过

标签: java spring-boot maven


【解决方案1】:

发现问题:

TLDR:将 spring boot 2.7 与(不支持的)Java 17 一起使用

希望这可以帮助某人:

  1. 我正在迁移的应用程序使用的是 Java 17。
  2. 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运行时却不慢

    无论如何,一如既往,键盘背后的设备的错(那是我)

【讨论】:

    猜你喜欢
    • 2016-10-09
    • 2016-11-16
    • 2021-05-07
    • 2021-08-13
    • 2018-08-16
    • 1970-01-01
    • 2018-04-25
    • 2018-04-20
    相关资源
    最近更新 更多