当前位置: 首页 > news >正文

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>

🔗 总结

性能优化是一个持续的过程,需要:

  1. 建立基准: 测量当前性能指标
  2. 识别瓶颈: 找出性能瓶颈所在
  3. 针对性优化: 根据瓶颈进行优化
  4. 验证效果: 测试优化效果
  5. 持续监控: 建立监控体系

本文关键词: 性能优化, JVM调优, 数据库优化, 缓存策略, 监控指标, 压力测试

http://www.lryc.cn/news/610844.html

相关文章:

  • HTTP性能优化实战:解决高并发场景下的连接瓶颈与延迟问题
  • 浏览器渲染 首屏优化 性能优化
  • ArrayList 深度剖析:从底层原理到性能优化的实战指南
  • MySQL索引底层原理与性能优化实践
  • 力扣:2246. 相邻字符不同的最长路径
  • 解析图像几何变换:从欧式到仿射再到透视
  • 从达梦到 StarRocks:国产数据库实时入仓实践
  • Python高级编程与实践:Python装饰器深入解析与应用
  • 使用 BAML 模糊解析改进 LangChain 知识图谱提取:成功率从25%提升到99%
  • 力扣刷题日常(15-16)
  • 【Electron】electron-vite中基于electron-builder与electron-updater实现程序远程自动更新,附源码
  • 国产大模型平替方案:Spring Boot通义千问API集成指南
  • 2025 年半导体用铜前驱体市场规模有多大?全景调研及投资前景分析
  • 接口测试用例书写规范
  • 基于 FFmpeg 与 V4L2 的多路摄像头视频采集,图像处理处理与 RTMP 推流项目(开源)
  • 【教育教学】人才培养方案制定
  • Linux内核C语言代码规范
  • MySQL内外连接详解
  • Python 基础语法(二):流程控制语句详解
  • 【Qt开发】常用控件(一)
  • 嵌入式硬件中运放的基本控制原理
  • 选佳沐信,智享便捷,乐在其中
  • LeetCode——2683. 相邻值的按位异或
  • 下架的软件又复活了,低调使用!
  • HFSS许可审计与分析
  • 用 Python 批量处理 Excel:从重复值清洗到数据可视化
  • Go语言实战案例:使用context控制协程取消
  • 【工程化】tree-shaking 的作用以及配置
  • 小杰数据结构——题库——拂衣便欲沧海去,但许明月随吾身
  • EP02:【DL 第二弹】张量的索引、分片、合并以及维度调整