【问题标题】:Low performance in springboot application (kotlin, gradle) with bootRun and without isOptimizedLaunch = false使用 bootRun 且未使用 Optimized Launch = false 的 Spring Boot 应用程序(kotlin、gradle)性能低下
【发布时间】:2020-05-04 04:31:14
【问题描述】:

当我在 junit 测试中运行我的函数时,我的时间比使用 bootRun 快 1000 倍。 当我在 build.gradle.kts 中设置时

tasks.getByName<org.springframework.boot.gradle.tasks.run.BootRun>("bootRun") {
    isOptimizedLaunch = false
}

时间相等,然后试运行。 为什么会发生?如何优化 bootJar? bootJar 没有参数 isOptimizedLaunch

函数示例

package com.example.demo

import java.util.concurrent.TimeUnit

class LongFun {
    fun main() {
        val startTime = System.nanoTime()

        for (i1 in 0..10000) {
            longFun(1000)
        }

        val endTime = System.nanoTime()

        val durationInNano = endTime - startTime //Total execution time in nano seconds

        var durationInMillis = TimeUnit.NANOSECONDS.toMillis(durationInNano)
        println("time=$durationInMillis")
    }

    fun longFun(n: Int) {
        for (i2 in 0..n) {
            for (i3 in 0..n) {
                var a = 1
            }
        }
    }
}

我用 https://start.spring.io/ (gradle, kotlin) 完成的完整代码并没有改变任何东西

更新1。这是一个简单的例子,在我的应用程序中使用 optaplanner 时实际上存在相同的问题,它也有很多计算。

更新2。使用 maven 我有同样糟糕的结果

  • 测试中 - 2ms
  • 在 gradle 中使用 isOptimizedLaunch = false - 2ms
  • 在没有 isOptimizedLaunch = false 的 gradle 中 - 5245ms
  • 在 Maven 中 - 5146 毫秒

【问题讨论】:

    标签: spring-boot maven gradle kotlin bootrun


    【解决方案1】:

    据我所知,optimizedLaunch 属性仅将以下两个参数添加到 JVM 启动命令中,没有其他任何内容:

    • -XX:TieredStopAtLevel=1
    • -Xverify:none

    如果您使用的是 Java 13 或更高版本,则不使用后者。

    这些参数用于使 JVM 启动更快,以用于开发和测试目的。这是以限制 JVM 在运行时优化自身的能力为代价的。在禁用运行时优化时看到如此缓慢的性能并不罕见。

    但是,如果您禁用 optimzedLaunch 以优先考虑运行时性能,您还应该看到 JVM 上的启动时间增加。在我的一个 Spring Boot 项目中,启动时间从 7 秒到 13 秒。因此,在实际项目中,在开发阶段,您必须决定要针对快速启动或快速运行进行优化。

    当您在生产环境中运行应用程序时,您很可能会使用由bootJar(或dist)任务创建的jar 文件。在这里,您负责提供 JVM 参数。如果您不提供任何内容,您将获得 JVM 的默认行为,即使用分层编译(对应于optimzedLaunch=false)。

    【讨论】:

    • 感谢您的回答,但我不明白为什么当我使用 bootJar(并且没有任何 JVM 参数)创建 jar 并从 java -jar 开始时性能如此缓慢?我怎样才能提高运行时间?快速启动对我来说并不重要。
    • 不确定。也许您可以尝试使用--info--debug 运行快速构建,以查看传递给java 的实际参数。也许 Spring Boot 添加了一些您可能想要包含的更多隐藏参数。
    猜你喜欢
    • 2019-04-24
    • 1970-01-01
    • 2019-01-31
    • 2018-09-12
    • 2019-11-27
    • 2014-08-08
    • 1970-01-01
    • 2019-01-22
    • 2022-06-21
    相关资源
    最近更新 更多