Spring Boot ist zweifellos das Framework Nummer eins für die Java-Backend-Entwicklung. Es basiert auf Spring Boot und verfügt über eine vollständige Toolkette und verschiedene Starter. Für die tägliche Geschäftsentwicklung kann man sagen, dass die Räder komplett sind.
Mit der Beliebtheit von Microservices und der Cloud-Native-Ära haben Spring Boot-Anwendungen jedoch einige Probleme aufgedeckt. Die auffälligsten sind:
Tatsächlich wissen wir alle, dass der größte Teil der Startzeit darauf zurückzuführen ist, dass Spring verschiedene Beans laden muss, was zu einer Verringerung der Startgeschwindigkeit führt
Im Allgemeinen In SpringBoot gibt es viele zeitaufwändige Aufgaben, z. B. den Aufbau einer Datenbankverbindung, die Erstellung des anfänglichen Thread-Pools usw. Wir können die Initialisierung dieser Vorgänge verzögern, um die Startgeschwindigkeit zu optimieren. Die Eigenschaft
spring.main.lazy-initialization wurde nach Spring Boot Version 2.2 eingeführt. Wenn sie auf „true“ konfiguriert ist, werden alle Beans verzögert initialisiert.
spring:main:lazy-initialization: true
Nachdem die verzögerte Initialisierung lokal aktiviert wurde, kann der Start 1 bis 2 Sekunden schneller erfolgen.
Umgebung |
Konfiguration |
(durchschnittlich zehnmal) Startgeschwindigkeit. |
springboot2+jdk1.8 |
|
≈10,3s |
Verzögerte Initialisierung von Bean |
≈8,63s |
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 |
Weitere Tipps:
1. Reduzieren Sie den Umfang von @ComponentScan @SpringBootApplication beim Scannen von Klassen
2. Schalten Sie die JMX-Überwachung von Spring Boot aus und setzen Sie spring.jmx.enabled=false
3. noverify, verifizieren Sie die Klasse nicht
4. Verzögern Sie das Laden von Beans, die beim Start nicht geladen werden müssen 5. Verwenden Sie das globale Lazy Loading von Spring Boot
5. Versuchen Sie, keine Annotationen für AOPQ-Aspekte zu verwenden, da dies alle Methoden verursacht beim Start gescannt werden 7. Deaktivieren Sie einige Endpunktüberwachungsfunktionen
6. Schließen Sie unnötige Jar-Abhängigkeiten des Projekts aus
7. Wenn Swagger die Schnittstelle scannt, legen Sie fest, dass nur die Klassen unter einem bestimmten Pfad gescannt werden sollen 10. Der Scan von Feign Die Client-Schnittstelle schränkt den Umfang des Paket-Scannens ein.
Zu diesem Zeitpunkt sollte die Startgeschwindigkeit als am besten angesehen werden, aber die große Speichernutzung ist immer noch ein Problem.
basiert auf den Funktionen der Java-Sprache. Und einige Implementierungsmethoden von Spring Boot bestimmen, dass auch dann der ungenutzte Speicher von G1/ZGC eingeschaltet und wiederhergestellt wird Mit der Zeit des Betriebssystems ist die Speichernutzung von Spring Boot immer noch viel größer als die von kompilierten Sprachen wie Golang. Wenn Java also die Probleme im Cloud-native-Zeitalter lösen will, basieren die aktuellen Lösungen grundsätzlich auf GraalVM, egal ob Quarkus oder Micronaut.
Hat Spring Boot eine ähnliche Lösung? :spring-graalvm-native
spring-graalvm-native ist eine sehr wichtige Funktion von springBoo6/SpringBoot3
. Es unterstützt die Verwendung von GraalVM zum Kompilieren von SpringBoot-Anwendungen in lokale ausführbare Image-Dateien Startgeschwindigkeit, Spitzenleistung und Reduzierung der Speichernutzung.Das obige ist der detaillierte Inhalt vonDer Betrieb und die Wartung haben mich gebeten, die Startgeschwindigkeit von SpringBoot zu optimieren, und das habe ich getan!. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!