2017-11-08 17 views
9

Mavenで起動しJARとして起動したときのSpring起動アプリケーションの起動時間に大きな違いがあることに気付きました。たとえば:Springブートアプリケーション - "mvn spring-boot:run"と "java -jar"を使用した起動時間の違い

  • mvn spring-boot:run - 5秒
  • java -jar myapp.jar - jarファイルを起動する25秒

は5倍長いようになります。それはなぜそうですか? Mavenを使ってアプリケーションを起動するとき、そしてjarファイルとしてバックグラウンドで何が起きていますか?何かが別にロードされていますか? Mavenで使用されている時間にjarファイルを起動することは可能ですか?

+1

のソースコードを見ることができますか? – SpaceTrucker

+0

'SpringApplication.run(MySpringBootApplication.class、args);の前後に' new Date() 'を追加しました。 – Anna

+0

mavenと 'java -jar myapp.jar'に' true 'を使用すると、各プロセスが存在する時間を測定できますか? – SpaceTrucker

答えて

8

この違いは、(明示的fork引数を設定しない限り)、それが実際に新しいスレッドとして実行されているMavenのJVM内で実行するんときspring-boot:runは、実際に、MavenのJVMの内部で春のブートアプリケーションを実行しているという事実に起因することができませんプロセス。スレッドの作成は、プロセスよりもはるかに高速です。

java -jarコマンドはOSプロセスを作成します。プロセスの作成には、プロセスIDを要求したり、メモリを割り当てるなどの手順があります。myapp.jarは、抽出する必要があります。さらに、JVMは最適化されません。 jarファイルから最初に抽出された.classが読み込まれます。基本的にコールドスタートには時間がかかります。

あなたが時間を測定ましたかMavenの春ブーツプラグインhere

+0

私の質問にお答えいただき、ありがとうございます。 私の 'pom.xml'に' true 'と' false 'を試しましたが、結果は同じでした - 私はまだMavenで5秒しか必要ありません。 私も 'myapp.jar'を解凍し、' java -cp。\ myapp org.springframework.boot.loader.JarLauncher'を使用しましたが、結果は同じ25秒でした。 これ以外に何ができますか? – Anna

+0

あなたの答えは信じがたいです。プロセスの作成には数秒かかりません。おそらくはミリ秒で、おそらくマイクロ秒です。 mavenから実行しても、クラスをロードしなければならず、まだjvmによって最適化されていないという事実は変わりません。 – Dariusz

+0

私はスタートアップ時にデータベースの初期化を行っています。そのため、プロセスは非常に遅いです。しかし、Mavenを使ったスタートアップがずっと速いという事実は変わりません。データベースの初期化を無効にすると、Mavenで2秒かかる必要があります( ' true'または ' false 'の場合は問題ありません)。 jarファイルの起動には7秒かかります。それはまだ3倍以上遅いです。 – Anna

関連する問題