Spring Boot는 의심할 여지 없이 Java 백엔드 개발을 위한 최고의 프레임워크입니다. Spring Boot를 기반으로 하며 완전한 도구 체인과 다양한 스타터를 갖추고 있습니다. 일상적인 비즈니스 개발을 위해서는 바퀴가 완성되었다고 말할 수 있습니다.
그러나 마이크로서비스와 클라우드 네이티브 시대의 인기로 인해 Spring Boot 애플리케이션은 몇 가지 문제를 노출했으며, 그보다 더 두드러진 문제는 다음과 같습니다. 메모리
spring:main:lazy-initialization: true
Environment
(평균 10회) 시작 속도 |
springboot2+jdk1.8 |
|
|
Bean의 지연 초기화 | ≒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을 설정하세요. noverify, 클래스를 확인하지 마세요.
4. 시작 시 로드할 필요가 없는 빈의 로딩을 지연하세요. 5. Spring Boot의 전역 지연 로딩을 사용하세요.
5. AOPQ 측면에 주석을 사용하지 마세요. 시작 시 스캔 7. 일부 엔드포인트 모니터링 기능 끄기
6. 프로젝트의 불필요한 jar 종속성을 제외
7. Swagger가 인터페이스를 스캔할 때 특정 경로 아래의 클래스만 스캔하도록 지정 10. Feign 스캔 클라이언트 인터페이스는 패키지 스캐닝 범위를 좁힙니다
이 시점에서 시작 속도가 가장 최적화되어 있다고 간주해야 하지만 여전히 대용량 메모리 사용량이 문제입니다
물론 jdk도 이 분야에서 많은 노력을 기울였습니다:
대량 메모리 사용량은 주로 메모리 사용량으로 인해 발생합니다. 운영 체제는 앞으로 반환되지 않으며 점차 개선되고 있습니다.
Java 언어의 기능을 기반으로 하며 Spring Boot의 일부 구현 방법에서는 G1/ZGC의 사용하지 않는 메모리를 켜서 반환하더라도 이를 결정합니다. 운영 체제가 시간이 지남에 따라 Spring Boot의 메모리 사용량은 여전히 Golang과 같은 컴파일 언어의 메모리 사용량보다 훨씬 큽니다.
그래서 Java가 클라우드 네이티브 시대의 문제를 해결하려는 경우 현재 솔루션은 Quarkus이든 Micronaut이든 기본적으로 GraalVM을 기반으로 합니다.
그럼 Spring Boot에도 비슷한 솔루션이 있나요? : spring-graalvm-native
4. SpringBoot3업그레이드는 springBoo6/SpringBoot3의 매우 중요한 기능으로, SpringBoot 애플리케이션을 로컬 실행 가능 이미지 파일로 컴파일하는 것을 지원합니다. 시작 속도, 최대 성능 및 메모리 사용량 감소.
위 내용은 운영 및 유지 관리 팀에서는 나에게 SpringBoot 시작 속도를 최적화하라고 요청했고 이것이 바로 내가 한 일입니다!의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!