-
Maven 依赖 -
application.properties/application.yml 配置 -
启动与访问 -
自定义业务指标示例 -
Grafana 可视化与 AlertManager
-
JVM 内存、GC 停顿、线程数 -
HTTP 请求速率、延迟分布(可借助 Histogram/Summary) -
缓存命中率: hit/(hit+miss) -
数据库连接池使用率:活跃连接数 vs 最大连接数
-
95% 延迟超过阈值 -
GC 停顿时长过长 -
连接池耗尽告警

async-profiler release 包,解压至服务器目录,如 /opt/async-profiler。
javaagent 参数:
java -agentpath:/opt/async-profiler/build/libasyncProfiler.so=start,svg,file=profile.svg -jar your-app.jar
3、运行一段业务场景(压测或真实流量),然后停止进程或通过 async-profiler 提供的 CLI 停止采样:
# 若不想重启,可 attach 模式:
./profiler.sh -d 30 -f profile.svg <pid>
4、查看生成的 profile.svg,用浏览器打开:

-
横轴表示消耗的采样比例,宽度越大表示更耗时的方法。 -
纵向为调用栈层级。 -
从最宽处逐层向下分析,找到热点方法,结合源代码定位优化点。
-
若热点在某个慢方法,可查看方法内部逻辑:是否存在不必要的循环、I/O 阻塞,或可并行优化。 -
若热点在序列化/反序列化,可考虑更高效的库或减小返回对象结构。 -
若大量时间在 GC,可结合 GC 日志分析堆配置是否合理。

location ~* \.(ico|gif|jpg|jpeg|png|css|js)$ {
add_header Cache-Control "max-age=31536000, immutable";
}
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_comp_level 6;
gzip_http_version 1.1;
gzip_types text/plain application/javascript text/css application/json;
http {
keepalive_timeout 60s 60s;
keepalive_requests 10000;
}
location / {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
}
Keep-Alive;可通过自定义 Connector 调整超时。
@SpringBootApplication(proxyBeanMethods = false)
publicclassAppimplementsWebServerFactoryCustomizer<ConfigurableServletWebServerFactory> {
publicstaticvoidmain(String[] args){
SpringApplication.run(App.class, args);
}
@Override
publicvoidcustomize(ConfigurableServletWebServerFactory factory){
if (factory instanceof TomcatServletWebServerFactory) {
TomcatServletWebServerFactory f = (TomcatServletWebServerFactory) factory;
f.setProtocol("org.apache.coyote.http11.Http11Nio2Protocol");
f.addConnectorCustomizers(c -> {
Http11NioProtocol protocol = (Http11NioProtocol) c.getProtocolHandler();
protocol.setMaxConnections(200);
protocol.setMaxThreads(200);
protocol.setConnectionTimeout(30000);
// protocol.setSelectorTimeout(3000); // NIO2 可选项
});
}
}
}
setMaxThreads 和 setMaxConnections值根据服务器硬件资源与业务并发调整,可在压测环境多次尝试并观察响应延迟、CPU 利用率、线程使用情况。

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-undertow</artifactId>
</dependency>
-XX:+UseG1GC -Xms2048m -Xmx2048m -XX:+AlwaysPreTouch -XX:MaxMetaspaceSize=256m -XX:ReservedCodeCacheSize=240m -XX:MaxDirectMemorySize=512m
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/dumps -XX:ErrorFile=/path/to/hs_err_pid%p.log
-Xlog:gc*,gc+age=trace,safepoint:file=logs/gc.log:utctime,pid,tags:filecount=5,filesize=100m
async-profiler 和 GC 日志深入分析。

-
下载与部署 -
启动应用时添加 Agent -
查看调用链与指标
-
访问 SkyWalking UI,可看到每次请求的调用链图、各段耗时、数据库/HTTP 调用详情、JVM 指标、GC 指标。 -
结合 Prometheus 等指标,综合判断:若某接口响应慢,可查看是哪一段(查询、序列化、远程调用等)成为瓶颈。
-
报警与自动化
-
DTO 精简与分页: 避免一次性返回过大结果集;对列表数据使用分页或流式方式(如 Spring MVC StreamingResponseBody)。 -
JSON 序列化优化: 选择高性能序列化库(Jackson 已较快,可开启 Afterburner 模块),避免将不必要字段序列化。 -
输入校验与限流: 对异常或恶意请求提前拦截,减少无效处理。 -
幂等性与缓存: 对可缓存接口,如 GET 查询,结合 HTTP 缓存头或后端缓存减少重复计算。
Service Bean 默认单例无状态,避免在 Bean 中维护请求级状态。
CompletableFuture、异步消息队列等;但要注意线程池配置与上下文传递。
-
本地缓存(Caffeine): 低延迟、减轻远程调用压力;监控命中率,避免缓存污染。 -
分布式缓存(Redis): 适用于共享场景;注意 TTL 策略、防止缓存穿透(布隆过滤、请求预热)、防止雪崩(加随机过期)、防止击穿(互斥锁或预加载)。
-
两阶段提交、TCC、本地消息表等方案都会增加延迟与资源占用;仅在必要场景使用。

-
原子性(Atomicity): 事务中的操作要么都做,要么都不做。 -
一致性(Consistency): 系统必须始终处在强一致状态下。 -
隔离性(Isolation): 一个事务的执行不能被其他事务所干扰。 -
持久性(Durability): 一个已提交的事务对数据库中数据的改变是永久性的。
Basically Available、Soft-state、Eventually consistent 三者的缩写,其中 BASE 分别代表:
-
基本可用(Basically Available): 系统能够基本运行、一直提供服务。 -
软状态(Soft-state): 系统不要求一直保持强一致状态。 -
最终一致性(Eventual consistency): 系统需要在某一时刻后达到一致性要求。
FetchType.LAZY,并在Service层通过显式查询或 DTO 投影避免 N+1。
EXPLAIN 确认索引命中,避免全表扫描。
core/max pool size、queue size;监控线程活跃度、队列长度,防止任务堆积。
往期推荐
SpringBoot3+国产FolkMQ!5行代码搞定消息中间件
Cursor Pro Ai编程工具 永久激活 无限续杯白嫖最高模型
开启Cloudflare邮箱接管 详细流程
IntelliJ IDEA 2025.2 最新激活教程,一键激活2099
如何优雅的实现在线人数统计功能?
Http 接口对接太繁琐?试试 UniHttp 框架吧!简简单单~

