Spring Boot は間違いなく Java バックエンド開発用の最大のフレームワークであり、Spring Boot に基づいて完全なツール チェーンとさまざまなスターターを備えています。日々の事業展開においては、車輪は完成していると言えます。
しかし、マイクロサービスとクラウド ネイティブ時代の人気に伴い、Spring Boot アプリケーションにはいくつかの問題が明らかになり、その中で最も顕著なものは次のとおりです。
実際、起動時間のほとんどは Spring がさまざまな Bean をロードする必要があるためであり、その結果、起動速度が低下することは誰もが知っています。
1. Bean の初期化の遅延一般に、SpringBoot にはデータベース接続の確立、初期スレッド プールの作成など、時間のかかるタスクが多数あります。初期化を遅延させることができます。これらの操作を実行して起動速度を最適化します。spring.main.lazy-initialization プロパティは、Spring Boot バージョン 2.2 以降に導入されました。true に設定すると、すべての Bean が遅延初期化されます。
spring:main:lazy-initialization: true
遅延初期化をローカルで有効にすると、起動が 1 ~ 2 秒速くなります。 #######################################環境########## ##構成
##springboot2 jdk1.8 |
##≈10.3s |
|
≈8.63秒 |
Spring5 之后提供了spring-context-indexer功能,可以通过在编译时创建一个静态候选列表来提高大型应用程序的启动性能。
先看官方的解释:
在项目中使用了@Indexed之后,编译打包的时候会在项目中自动生成META-INT/spring.components文件。
当Spring应用上下文执行ComponentScan扫描时,META-INT/spring.components将会被CandidateComponentsIndexLoader 读取并加载,转换为CandidateComponentsIndex对象,这样的话@ComponentScan不在扫描指定的package,而是读取CandidateComponentsIndex对象,从而达到提升性能的目的.
我们只需要将依赖引入,然后在启动类上使用@Indexed注解即可。这样在程序编译打包之后会生成
META-INT/spring.components文件,当执行@ComponentScan扫描类时,会读取索引文件,提高扫描速度。
<dependency> <groupid>org.springframework</groupid> <artifactid>spring-context-indexer</artifactid> <optional>true</optional></dependency>
@Indexed@SpringBootApplicationpublic class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}}
环境 |
配置 |
(十次平均值)启动速度 |
springboot2+jdk1.8 |
≈10.3s |
|
+延迟初始化Bean |
≈8.63s |
|
+创建扫描索引 |
≈7.7s |
その他のヒント:
1. クラスをスキャンするときに @ComponentScan @SpringBootApplication のスコープを縮小します
2. Spring Boot の JMX をオフにするモニタリング、 spring.jmx.enabled=false
3. JVM パラメータを設定 -noverify、クラスを検証しない
4. 起動時にロードされない Bean のロードを遅延する 5. Spring を使用するBoot のグローバルな遅延読み込み 1
5. AOPQ の側面にはアノテーションを使用しないようにしてください。これにより、起動時にすべてのメソッドがスキャンされることになります 7. 一部のエンドポイント監視機能をオフにします
6. 冗長性を除外しますプロジェクト jar に依存する
#7. swagger でインターフェースをスキャンする場合、特定のパスにあるクラスのみをスキャンするように指定します 10. Feign クライアント インターフェースのスキャンにより、パッケージ スキャンの範囲が縮小されます。非常に極端ですが、大量のメモリ使用量が依然として問題です3. jdk17 のアップグレードもちろん、jdk はこの点でも多大な努力を払ってきました。#メモリ占有率が高くなる主な理由は、メモリが占有された後にオペレーティング システムに返されないことです。これは徐々に改善されています:
したがって、Java がクラウド ネイティブ時代の問題を解決したい場合、現在のソリューションは Quarkus にせよ Micronaut にせよ、基本的に GraalVM に基づいています。
では、Spring Boot にも同様のソリューションはあるのでしょうか? :spring-graalvm-native
4. SpringBoot3
spring-graalvm-native のアップグレードは、springBoot6/SpringBoot3 の非常に重要な機能です。 GraalVM を使用して SpringBoot アプリケーションをローカルの実行可能イメージ ファイルにコンパイルすると、起動速度、ピーク パフォーマンスが大幅に向上し、メモリ使用量が削減されます。以上が運用とメンテナンスから SpringBoot の起動速度を最適化するように依頼され、これを実行しました。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。