👋 大家好,我是 阿问学长
!专注于分享优质开源项目
解析、毕业设计项目指导
支持、幼小初高
的教辅资料
推荐等,欢迎关注交流!🚀
SpringBoot 3.x 性能优化技巧
🚀 性能优化概述
性能优化是SpringBoot应用开发中的重要环节。本文将从多个维度介绍SpringBoot 3.x的性能优化技巧,帮助您构建高性能的应用程序。
优化维度
- 启动性能: 减少启动时间
- 运行时性能: 提高请求处理速度
- 内存优化: 减少内存占用
- 数据库优化: 提高数据访问效率
- 缓存优化: 合理使用缓存机制
⚡ 启动性能优化
1. 懒加载配置
spring:
main:
lazy-initialization: true # 启用全局懒加载
或者选择性懒加载:
@Configuration
public class LazyConfig {
@Bean
@Lazy
public HeavyService heavyService() {
return new HeavyService();
}
@Component
@Lazy
public 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 # 禁用OSIV
devtools:
restart:
enabled: false # 生产环境禁用devtools
autoconfigure:
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: 20
minimum-idle: 5
idle-timeout: 300000
connection-timeout: 20000
max-lifetime: 1200000
leak-detection-threshold: 60000
data:
redis:
lettuce:
pool:
max-active: 8
max-idle: 8
min-idle: 0
max-wait: -1ms
3. HTTP客户端优化
@Configuration
public class HttpClientConfig {
@Bean
public 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);
}
@Bean
public 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>() {
@Override
public StringBuilder create() {
return new StringBuilder();
}
@Override
public PooledObject<StringBuilder> wrap(StringBuilder obj) {
return new DefaultPooledObject<>(obj);
}
@Override
public 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();
}
@EventListener
public 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: 50
batch_versioned_data: true
order_inserts: true
order_updates: true
# 查询优化
default_batch_fetch_size: 16
max_fetch_depth: 3
# 二级缓存
cache:
use_second_level_cache: true
use_query_cache: true
region:
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")
@Transactional
public Product save(Product product) {
return productRepository.save(product);
}
@CacheEvict(value = "products", allEntries = true)
@Transactional
public void deleteById(Long id) {
productRepository.deleteById(id);
}
}
📊 监控与分析
1. 性能监控配置
management:
endpoints:
web:
exposure:
include: "*"
endpoint:
health:
show-details: always
metrics:
export:
prometheus:
enabled: true
distribution:
percentiles-histogram:
http.server.requests: true
percentiles:
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 {
@EventListener
public 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: 200
min-spare: 10
max-connections: 8192
accept-count: 100
connection-timeout: 20000
compression:
enabled: true
mime-types: text/html,text/xml,text/plain,text/css,text/javascript,application/javascript,application/json
min-response-size: 1024
spring:
# JPA优化
jpa:
show-sql: false
properties:
hibernate:
format_sql: false
use_sql_comments: false
# 日志优化
output:
ansi:
enabled: never
logging:
level:
org.springframework: WARN
org.hibernate: WARN
com.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调优, 数据库优化, 缓存策略, 监控指标, 压力测试