ホームページ  >  記事  >  運用・保守  >  運用とメンテナンスから SpringBoot の起動速度を最適化するように依頼され、これを実行しました。

運用とメンテナンスから SpringBoot の起動速度を最適化するように依頼され、これを実行しました。

WBOY
WBOY転載
2023-06-08 18:52:311783ブラウズ

Spring Boot は間違いなく Java バックエンド開発用の最大のフレームワークであり、Spring Boot に基づいて完全なツール チェーンとさまざまなスターターを備えています。日々の事業展開においては、車輪は完成していると言えます。

しかし、マイクロサービスとクラウド ネイティブ時代の人気に伴い、Spring Boot アプリケーションにはいくつかの問題が明らかになり、その中で最も顕著なものは次のとおりです。

  • 起動が遅い
  • アプリケーションが多くのメモリを消費します
  • クラウド ネイティブ アプリケーションには、起動速度に対する比較的高い要件があります。水平方向の拡張が必要な​​場合は、新しいリクエストをできるだけ早く処理するために、これらの新しいインスタンスを十分な短い時間内に開始する必要があります。
  • #クラウドネイティブ アプリケーションは、実行時に必要なリソースをできる限り少なくします。 1 つのインスタンスによって占有されるリソースを可能な限り削減することは、同じコストでより多くのアクセス要求をサポートできることを意味します。
  • #クラウド ネイティブ アプリケーションでは、必要なパッケージ容量が小さくなります。クラウド ネイティブ アプリケーションは、コンテナ イメージの形式でパッケージ化されます。アプリケーション イメージのサイズが大きくなるほど、必要な記憶域も大きくなり、イメージのプッシュとプルにかかる時間も長くなります。

実際、起動時間のほとんどは Spring がさまざまな Bean をロードする必要があるためであり、その結果、起動速度が低下することは誰もが知っています。

1. Bean の初期化の遅延

一般に、SpringBoot にはデータベース接続の確立、初期スレッド プールの作成など、時間のかかるタスクが多数あります。初期化を遅延させることができます。これらの操作を実行して起動速度を最適化します。

spring.main.lazy-initialization プロパティは、Spring Boot バージョン 2.2 以降に導入されました。true に設定すると、すべての Bean が遅延初期化されます。

spring:main:lazy-initialization: true

遅延初期化をローカルで有効にすると、起動が 1 ~ 2 秒速くなります。 #######################################環境########## ##構成

#(平均 10 倍) 起動速度 ##遅延初期化 Bean

##springboot2 jdk1.8

##≈10.3s

≈8.63秒

#

二、创建扫描索引

Spring5 之后提供了spring-context-indexer功能,可以通过在编译时创建一个静态候选列表来提高大型应用程序的启动性能。

先看官方的解释:

運用とメンテナンスから SpringBoot の起動速度を最適化するように依頼され、これを実行しました。

在项目中使用了@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);}}

運用とメンテナンスから SpringBoot の起動速度を最適化するように依頼され、これを実行しました。

环境

配置

(十次平均值)启动速度

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 はこの点でも多大な努力を払ってきました。

#メモリ占有率が高くなる主な理由は、メモリが占​​有された後にオペレーティング システムに返されないことです。これは徐々に改善されています:

    G1 JDK12 以降がサポートされました
  • ZGC JDK13 以降がサポートされました
Java 言語と Spring Boot の特性に基づく 一部の実装方法では、G1/ZGC の未使用メモリがオンになり、時間内にオペレーティング システムに返されたとしても、G1/ZGC のメモリ使用量はSpring Boot は、Golang などのコンパイル言語よりもまだはるかに大きいです。

したがって、Java がクラウド ネイティブ時代の問題を解決したい場合、現在のソリューションは Quarkus にせよ Micronaut にせよ、基本的に GraalVM に基づいています。

では、Spring Boot にも同様のソリューションはあるのでしょうか? :spring-graalvm-native

4. SpringBoot3

spring-graalvm-native のアップグレードは、springBoot6/SpringBoot3

の非常に重要な機能です。 GraalVM を使用して SpringBoot アプリケーションをローカルの実行可能イメージ ファイルにコンパイルすると、起動速度、ピーク パフォーマンスが大幅に向上し、メモリ使用量が削減されます。

以上が運用とメンテナンスから SpringBoot の起動速度を最適化するように依頼され、これを実行しました。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事は51cto.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。