SpringBoot3.x入门到精通系列:4.3 性能优化技巧
👋 大家好,我是 阿问学长
!专注于分享优质开源项目
解析、毕业设计项目指导
支持、幼小初高
的教辅资料
推荐等,欢迎关注交流!🚀
SpringBoot 3.x 性能优化技巧
🚀 性能优化概述
性能优化是SpringBoot应用开发中的重要环节。本文将从多个维度介绍SpringBoot 3.x的性能优化技巧,帮助您构建高性能的应用程序。
优化维度
- 启动性能: 减少启动时间
- 运行时性能: 提高请求处理速度
- 内存优化: 减少内存占用
- 数据库优化: 提高数据访问效率
- 缓存优化: 合理使用缓存机制
⚡ 启动性能优化
1. 懒加载配置
spring:main:lazy-initialization: true # 启用全局懒加载
或者选择性懒加载:
@Configuration
public class LazyConfig {@Bean@Lazypublic HeavyService heavyService() {return new HeavyService();}@Component@Lazypublic static class ExpensiveComponent {public ExpensiveComponent() {// 耗时的初始化操作}}
}
2. 排除不必要的自动配置
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class,HibernateJpaAutoConfiguration.class,SecurityAutoConfiguration.class
})
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}
3. 使用配置属性优化
spring:jpa:open-in-view: false # 禁用OSIVdevtools:restart:enabled: false # 生产环境禁用devtoolsautoconfigure:exclude:- org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration
4. JVM启动参数优化
java -jar app.jar \-Xms512m -Xmx1024m \-XX:+UseG1GC \-XX:MaxGCPauseMillis=200 \-XX:+UnlockExperimentalVMOptions \-XX:+UseJVMCICompiler \-Dspring.backgroundpreinitializer.ignore=true
🏃 运行时性能优化
1. 异步处理
@Configuration
@EnableAsync
public class AsyncConfig {@Bean(name = "taskExecutor")public Executor taskExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setCorePoolSize(4);executor.setMaxPoolSize(8);executor.setQueueCapacity(100);executor.setThreadNamePrefix("async-");executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());executor.initialize();return executor;}
}@Service
public class EmailService {@Async("taskExecutor")public CompletableFuture<Void> sendEmailAsync(String to, String subject, String content) {// 异步发送邮件try {Thread.sleep(2000); // 模拟耗时操作System.out.println("邮件发送成功: " + to);} catch (InterruptedException e) {Thread.currentThread().interrupt();}return CompletableFuture.completedFuture(null);}
}
2. 连接池优化
spring:datasource:hikari:maximum-pool-size: 20minimum-idle: 5idle-timeout: 300000connection-timeout: 20000max-lifetime: 1200000leak-detection-threshold: 60000data:redis:lettuce:pool:max-active: 8max-idle: 8min-idle: 0max-wait: -1ms
3. HTTP客户端优化
@Configuration
public class HttpClientConfig {@Beanpublic RestTemplate restTemplate() {HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();factory.setConnectTimeout(5000);factory.setReadTimeout(10000);// 连接池配置PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();connectionManager.setMaxTotal(100);connectionManager.setDefaultMaxPerRoute(20);CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(connectionManager).build();factory.setHttpClient(httpClient);return new RestTemplate(factory);}@Beanpublic WebClient webClient() {ConnectionProvider connectionProvider = ConnectionProvider.builder("custom").maxConnections(100).maxIdleTime(Duration.ofSeconds(20)).maxLifeTime(Duration.ofSeconds(60)).pendingAcquireTimeout(Duration.ofSeconds(60)).evictInBackground(Duration.ofSeconds(120)).build();HttpClient httpClient = HttpClient.create(connectionProvider).option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000).responseTimeout(Duration.ofSeconds(10));return WebClient.builder().clientConnector(new ReactorClientHttpConnector(httpClient)).build();}
}
💾 内存优化
1. JVM内存参数调优
# 堆内存设置
-Xms1g -Xmx2g# 新生代设置
-XX:NewRatio=3
-XX:SurvivorRatio=8# 元空间设置
-XX:MetaspaceSize=256m
-XX:MaxMetaspaceSize=512m# GC优化
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-XX:G1HeapRegionSize=16m
2. 对象池化
@Component
public class ObjectPoolConfig {private final GenericObjectPool<StringBuilder> stringBuilderPool;public ObjectPoolConfig() {GenericObjectPoolConfig<StringBuilder> config = new GenericObjectPoolConfig<>();config.setMaxTotal(100);config.setMaxIdle(20);config.setMinIdle(5);this.stringBuilderPool = new GenericObjectPool<>(new BasePooledObjectFactory<StringBuilder>() {@Overridepublic StringBuilder create() {return new StringBuilder();}@Overridepublic PooledObject<StringBuilder> wrap(StringBuilder obj) {return new DefaultPooledObject<>(obj);}@Overridepublic void passivateObject(PooledObject<StringBuilder> p) {p.getObject().setLength(0); // 清空StringBuilder}}, config);}public StringBuilder borrowStringBuilder() throws Exception {return stringBuilderPool.borrowObject();}public void returnStringBuilder(StringBuilder sb) {stringBuilderPool.returnObject(sb);}
}
3. 内存泄漏检测
@Component
public class MemoryMonitor {private final MeterRegistry meterRegistry;public MemoryMonitor(MeterRegistry meterRegistry) {this.meterRegistry = meterRegistry;// 注册内存使用指标Gauge.builder("jvm.memory.used.heap").register(meterRegistry, this, MemoryMonitor::getHeapMemoryUsed);Gauge.builder("jvm.memory.used.nonheap").register(meterRegistry, this, MemoryMonitor::getNonHeapMemoryUsed);}private double getHeapMemoryUsed(MemoryMonitor monitor) {return ManagementFactory.getMemoryMXBean().getHeapMemoryUsage().getUsed();}private double getNonHeapMemoryUsed(MemoryMonitor monitor) {return ManagementFactory.getMemoryMXBean().getNonHeapMemoryUsage().getUsed();}@EventListenerpublic void handleMemoryWarning(MemoryWarningEvent event) {System.gc(); // 建议进行垃圾回收// 记录日志或发送告警}
}
🗄️ 数据库性能优化
1. JPA查询优化
@Repository
public interface UserRepository extends JpaRepository<User, Long> {// 使用@Query优化查询@Query("SELECT u FROM User u LEFT JOIN FETCH u.roles WHERE u.active = true")List<User> findActiveUsersWithRoles();// 投影查询,只查询需要的字段@Query("SELECT new com.example.dto.UserSummary(u.id, u.name, u.email) FROM User u")List<UserSummary> findUserSummaries();// 分页查询@Query("SELECT u FROM User u WHERE u.name LIKE %:name%")Page<User> findByNameContaining(@Param("name") String name, Pageable pageable);// 批量操作@Modifying@Query("UPDATE User u SET u.lastLoginTime = :time WHERE u.id IN :ids")int updateLastLoginTime(@Param("time") LocalDateTime time, @Param("ids") List<Long> ids);
}
2. 数据库连接优化
spring:jpa:properties:hibernate:# 批量操作优化jdbc:batch_size: 50batch_versioned_data: trueorder_inserts: trueorder_updates: true# 查询优化default_batch_fetch_size: 16max_fetch_depth: 3# 二级缓存cache:use_second_level_cache: trueuse_query_cache: trueregion:factory_class: org.hibernate.cache.jcache.JCacheRegionFactory
3. 缓存策略
@Entity
@Cacheable
@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Product {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String name;private BigDecimal price;// getter和setter
}@Service
@Transactional(readOnly = true)
public class ProductService {@Cacheable(value = "products", key = "#id")public Product findById(Long id) {return productRepository.findById(id).orElseThrow(() -> new ProductNotFoundException("Product not found: " + id));}@Cacheable(value = "products", key = "'all'")public List<Product> findAll() {return productRepository.findAll();}@CacheEvict(value = "products", key = "#product.id")@Transactionalpublic Product save(Product product) {return productRepository.save(product);}@CacheEvict(value = "products", allEntries = true)@Transactionalpublic void deleteById(Long id) {productRepository.deleteById(id);}
}
📊 监控与分析
1. 性能监控配置
management:endpoints:web:exposure:include: "*"endpoint:health:show-details: alwaysmetrics:export:prometheus:enabled: truedistribution:percentiles-histogram:http.server.requests: truepercentiles:http.server.requests: 0.5, 0.95, 0.99
2. 自定义性能指标
@Component
public class PerformanceMetrics {private final Counter requestCounter;private final Timer requestTimer;private final Gauge activeConnections;public PerformanceMetrics(MeterRegistry meterRegistry) {this.requestCounter = Counter.builder("api.requests.total").description("Total API requests").register(meterRegistry);this.requestTimer = Timer.builder("api.requests.duration").description("API request duration").register(meterRegistry);this.activeConnections = Gauge.builder("db.connections.active").description("Active database connections").register(meterRegistry, this, PerformanceMetrics::getActiveConnections);}public void incrementRequestCount() {requestCounter.increment();}public Timer.Sample startTimer() {return Timer.start();}public void recordTimer(Timer.Sample sample) {sample.stop(requestTimer);}private double getActiveConnections(PerformanceMetrics metrics) {// 获取活跃连接数的逻辑return 0.0;}
}
3. 性能分析工具
@Component
public class PerformanceProfiler {@EventListenerpublic void handleSlowQuery(SlowQueryEvent event) {if (event.getExecutionTime() > 1000) { // 超过1秒的查询log.warn("Slow query detected: {} ms - {}", event.getExecutionTime(), event.getQuery());}}@Around("@annotation(Timed)")public Object timeMethod(ProceedingJoinPoint joinPoint) throws Throwable {long startTime = System.currentTimeMillis();try {return joinPoint.proceed();} finally {long executionTime = System.currentTimeMillis() - startTime;log.info("Method {} executed in {} ms", joinPoint.getSignature().getName(), executionTime);}}
}@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Timed {
}
🔧 配置优化
1. 生产环境配置
server:# 服务器优化tomcat:threads:max: 200min-spare: 10max-connections: 8192accept-count: 100connection-timeout: 20000compression:enabled: truemime-types: text/html,text/xml,text/plain,text/css,text/javascript,application/javascript,application/jsonmin-response-size: 1024spring:# JPA优化jpa:show-sql: falseproperties:hibernate:format_sql: falseuse_sql_comments: false# 日志优化output:ansi:enabled: neverlogging:level:org.springframework: WARNorg.hibernate: WARNcom.zaxxer.hikari: WARN
2. 原生镜像优化
<plugin><groupId>org.graalvm.buildtools</groupId><artifactId>native-maven-plugin</artifactId><configuration><buildArgs><buildArg>--no-fallback</buildArg><buildArg>--enable-preview</buildArg><buildArg>-H:+ReportExceptionStackTraces</buildArg><buildArg>-H:+AddAllCharsets</buildArg><buildArg>-H:IncludeResources=.*\.properties$</buildArg></buildArgs></configuration>
</plugin>
📈 性能测试
1. 压力测试脚本
# 使用Apache Bench进行压力测试
ab -n 10000 -c 100 http://localhost:8080/api/users# 使用wrk进行压力测试
wrk -t12 -c400 -d30s http://localhost:8080/api/users
2. JMeter测试计划
<?xml version="1.0" encoding="UTF-8"?>
<jmeterTestPlan version="1.2"><hashTree><TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="API Performance Test"><elementProp name="TestPlan.arguments" elementType="Arguments" guiclass="ArgumentsPanel"><collectionProp name="Arguments.arguments"/></elementProp><stringProp name="TestPlan.user_define_classpath"></stringProp><boolProp name="TestPlan.serialize_threadgroups">false</boolProp><boolProp name="TestPlan.functional_mode">false</boolProp></TestPlan></hashTree>
</jmeterTestPlan>
🔗 总结
性能优化是一个持续的过程,需要:
- 建立基准: 测量当前性能指标
- 识别瓶颈: 找出性能瓶颈所在
- 针对性优化: 根据瓶颈进行优化
- 验证效果: 测试优化效果
- 持续监控: 建立监控体系
本文关键词: 性能优化, JVM调优, 数据库优化, 缓存策略, 监控指标, 压力测试