plugins/languages/java/skills/performance/SKILL.md
Java 性能优化规范 — JFR 生产 profiling、JMH 基准测试、Generational ZGC / G1GC 调优、GraalVM Native Image、CDS、async-profiler 火焰图、Micrometer 指标。当用户排查性能瓶颈、内存泄漏、GC 停顿、优化吞吐/延迟,或讨论 "性能优化"、"JFR"、"JMH"、"GC 调优"、"ZGC"、"Native Image"、"火焰图"、"profiling"、"benchmark" 时加载。
npx skillsauth add lazygophers/ccplugin java-performanceInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
数据驱动,禁猜测:profile → 找热点 → 改 → JMH 验证 → 回归测试。
disk=true,maxsize=500m,maxage=1d)IntStream / LongStream 处理原始类型# 启动时持续记录 (生产推荐)
java -XX:StartFlightRecording=disk=true,maxsize=500m,maxage=1d \
-XX:FlightRecorderOptions=stackdepth=256 \
-jar app.jar
# 运行时按需
jcmd <pid> JFR.start duration=60s filename=run.jfr settings=profile
jcmd <pid> JFR.dump filename=now.jfr
# 离线分析
jfr summary run.jfr
jfr print --events jdk.CPULoad,jdk.GarbageCollection run.jfr
# 或 JMC GUI (https://www.oracle.com/java/technologies/jdk-mission-control.html)
关注事件:
jdk.ExecutionSample、jdk.CPULoadjdk.ObjectAllocationInNewTLAB、jdk.OldObjectSamplejdk.GarbageCollection、jdk.GCPhasePausejdk.JavaMonitorEnter、jdk.ThreadParkjdk.VirtualThreadPinned@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.MICROSECONDS)
@State(Scope.Benchmark)
@Warmup(iterations = 3, time = 1)
@Measurement(iterations = 5, time = 1)
@Fork(2)
public class CollectionBenchmark {
private List<String> data;
@Setup public void setup() {
data = IntStream.range(0, 10_000).mapToObj(i -> "item-" + i).toList();
}
@Benchmark public long streamCount() {
return data.stream().filter(s -> s.contains("5")).count();
}
@Benchmark public long parallelStream() {
return data.parallelStream().filter(s -> s.contains("5")).count();
}
}
// build.gradle
plugins { id 'me.champeau.jmh' version '0.7.2' }
jmh { warmupIterations = 3; iterations = 5; fork = 2; resultFormat = 'JSON' }
./gradlew jmh
java -XX:+UseZGC -XX:+ZGenerational \
-Xms4g -Xmx4g \
-jar app.jar
java -XX:+UseG1GC -XX:MaxGCPauseMillis=200 \
-XX:G1HeapRegionSize=16m -XX:+G1UseAdaptiveIHOP \
-Xms4g -Xmx4g -jar app.jar
java -Xlog:gc*:file=gc.log:time,uptime,level,tags:filecount=5,filesize=100m -jar app.jar
# 分析:GCEasy.io、GCViewer
# CDS (Class Data Sharing) — 轻量,启动提速 20-40%
java -XX:ArchiveClassesAtExit=app.jsa -jar app.jar # 1) 创建归档
java -XX:SharedArchiveFile=app.jsa -jar app.jar # 2) 复用
# GraalVM Native Image — 启动 <100ms,内存 -50~80%
./gradlew nativeCompile
./build/native/nativeCompile/my-app
# 适用:Serverless、CLI、低内存容器;不适:反射重度依赖
// 集合预容量
List<User> users = new ArrayList<>(expectedSize);
Map<String, User> map = HashMap.newHashMap(expectedSize); // Java 19+
// 字符串
String result = String.join(",", list); // 替代手动循环
String s = "name=%s, age=%d".formatted(n, a); // 替代 String.format
// 原始 Stream,避免装箱
IntStream.range(0, 100).sum();
OptionalInt max = IntStream.of(1, 2, 3).max();
// 不可变 List
List<T> result = stream.toList(); // Java 16+
// JPA fetch 防 N+1
@Query("SELECT u FROM User u JOIN FETCH u.orders WHERE u.id IN :ids")
List<User> findAllWithOrders(@Param("ids") List<Long> ids);
// HikariCP
// spring.datasource.hikari.maximum-pool-size=10
// spring.datasource.hikari.minimum-idle=5
// spring.datasource.hikari.connection-timeout=2000
@Timed(value = "user.query", percentiles = {0.5, 0.95, 0.99})
public Optional<User> findById(Long id) { ... }
@Bean
public TimedAspect timedAspect(MeterRegistry r) { return new TimedAspect(r); }
四大黄金指标:延迟 (P50/P95/P99/P999)、吞吐 (QPS/TPS)、错误率、饱和度。
./asprof -d 30 -f cpu.html <pid> # CPU
./asprof -d 30 -e alloc -f alloc.html <pid> # 分配
./asprof -d 30 -e lock -f lock.html <pid> # 锁竞争
./asprof -d 30 -e wall -f wall.html <pid> # 含等待时间
| AI 易犯解释 | 实际应核验 | |---------|---------| | "凭经验改" | 是否有 JFR/JMH 数据? | | "看起来慢" | 是否是 profiling 热点? | | "快了 10%" | 是否 JMH 置信区间验证? | | "G1 够用" | 是否评估 Generational ZGC? | | "JVM 默认参数" | 是否按负载调优? | | "parallelStream 更快" | 数据是否 >10K + CPU 密集? | | "Native Image 太麻烦" | Serverless/CLI 是否评估? |
JOIN FETCH 防 N+1development
Go 数据库规范——GORM Model 命名 ModelXxx、表名单数、枚举 uint8 + 常量、索引 idx_ 前缀 + deleted_at leading column、禁 time.Time 统一 int64 unix、禁指针/nullable 字段、TEXT/BLOB/JSON 禁 default、AutoMigrate 禁改主键。设计 DB model、写 GORM tag、建索引、做 migration 审查时触发。
development
Go HTTP API 规范——响应始终 200 + body code 字段、路由 /api/* 全 POST 单段 <Action><Model>、中间件逐路由注册禁 Group(prefix,mw...)、handler 仅返回 (rsp,error)、认证走 header。设计 HTTP API、写路由/handler/中间件时触发。
development
Go 项目结构规范——三层架构(API → Impl → State)、全局状态模式、internal/ 私有包、cmd/ 仅 main.go、go.work 多模块、禁止 Repository 接口和 DI 容器、struct 公共字段开头全 omitempty、handler var rsp 顶声明、禁 legacy migration。设计项目骨架、新建目录、组织包、做架构评审时触发。
development
Go 命名规范——Id/Uid 字段(非 ID)、IsActive/HasMFA 布尔前缀、CreatedAt 时间字段、接收者统一用 p、包名全小写无下划线、泛型类型参数描述性命名、集合字段 xxx_list 禁 xxxs 复数、Enum 0 值 XxxNil 禁 Unknown、禁 Status 统一 State、Set/Update 语义区分。定义结构体字段、函数、变量、包、接收者名、泛型、枚举时触发。