簡體   English   中英

mvn spring-boot:與 java -jar xxx.jar 相比運行緩慢

[英]mvn spring-boot:run slow compared to java -jar xxx.jar

我正在嘗試將現有的命令行應用程序遷移到 Spring 啟動,但我遇到了一個奇怪的問題。

該應用程序可以運行,但在使用mvn spring-boot:run啟動時似乎非常慢

緩慢的不是應用程序啟動。 有一種方法應該從數據庫中獲取大約 1.8 Mio 記錄並從結果集中創建 POJO。 通常這最多需要 40 秒。

使用以 maven 啟動的應用程序需要 > 5 分鍾。

如果我用java -jar app.jar啟動它,它工作得很好/很快。 應用程序在 IntelliJ 中啟動時也很快。

我猜這可能與類路徑有關,但這只是一個猜測。

我在應用程序中所做的就是將一些 Singelton 類遷移到 @Components 並添加 spring-boot-maven-plugin

有任何想法嗎?

發現問題:

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運行時卻不慢)

無論如何,一如既往,鍵盤背后的設備的錯(那是我)

JVM 編譯您的字節碼以獲得更好的性能。 有多個編譯器,稱為 C1 和 C2。
C1 編譯器效率適中,但編譯速度很快。
C2編譯器效率更高,編譯代碼更快,但是這個編譯器更慢。
因此,編譯代碼的性能與編譯代碼所需的時間之間存在權衡。
如果您禁用 C2 編譯器(通過使用 -XX:TieredStopAtLevel=1,它告訴 JVM 僅使用 C1),您的應用程序將啟動得非常快。 這非常適合單元測試,或者如果您的應用程序長時間無法運行,因為您不會浪費時間使用 C2 進行編譯,並且您沒有時間真正受益於 C2 編譯的代碼。 同時,代碼執行速度不會達到最佳。 這就是您的情況:您的應用程序可以運行很長時間,因此它可以從 C2 編譯中受益。 不幸的是,您禁用了它,這就解釋了為什么您的自定義代碼如此緩慢。 如果您啟用 C2 編譯,您的應用程序啟動速度會稍慢一些,但您有時間從 C2 中受益,並且隨着時間的推移您將獲得更好的性能。

想象一下,您想撥打 go 到面包店購買羊角面包。 1公里。 您可以乘坐 C1 Lada 汽車:速度較慢,但可以立即啟動。 你可以乘坐 C2 Tesla 汽車:它的速度非常快,但你必須先為其電池充電 5 小時......你將乘坐 C1 Lada 汽車。
如果你想去500公里外的海灘度假,你會乘坐C2特斯拉汽車:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM