Java性能分析工具
Java性能分析工具
性能分析工具帮助开发者定位代码瓶颈、内存泄漏和线程问题,是性能调优的必备工具。
JProfiler实战
远程分析
# 启动Java应用时添加agent
java -agentpath:/path/to/libjprofilerti.so=port=8849 \
-jar app.jar
# 或使用JAttach
jattach <pid> load instrument true /path/to/libprofilerti.so
代码中集成
public class PerformanceAnalyzer {
private static final Profiler PROFILER = new Profiler("My Application");
public void processOrder(Order order) {
// 开始CPU分析
PROFILER.startCPU("processOrder");
try {
validateOrder(order);
calculateTotal(order);
saveOrder(order);
} finally {
// 停止CPU分析
PROFILER.stopCPU();
}
}
public void memoryAnalysis() {
// 内存快照
PROFILER.startMemory("memoryAnalysis");
List<Data> data = loadData(); // 大量对象创建
processData(data);
PROFILER.stopMemory();
}
}
VisualVM使用
# 启动VisualVM
jvisualvm
# 命令行分析
jmap -heap <pid>
jstat -gc <pid> 1000 10
诊断命令实战
// JFR (Java Flight Recorder) 低开销生产级分析
// 启动时开启
java -XX:StartFlightRecording=duration=60s,filename=recording.jfr \
-jar app.jar
// 运行时开启
// jcmd <pid> JFR.start duration=60s filename=recording.jfr
常见性能问题定位
CPU热点
# 使用async-profiler(推荐)
./profiler.sh -d 30 -f profile.html <pid>
# 使用jstack分析线程
jstack <pid> > thread_dump.txt
内存分析
# 堆转储
jmap -dump:live,format=b,file=heap.bin <pid>
# 使用Eclipse MAT分析
# 1. 打开heap.bin
# 2. 查看Leak Suspects报告
# 3. 分析Dominator Tree
自定义监控
@Component
public class CustomProfiler {
private final MeterRegistry registry;
private final ThreadLocal<Long> timer = new ThreadLocal<>();
@Around("@annotation(Timed)")
public Object profile(ProceedingJoinPoint pjp) throws Throwable {
long start = System.nanoTime();
try {
return pjp.proceed();
} finally {
long duration = System.nanoTime() - start;
registry.timer(pjp.getSignature().getName())
.record(duration, TimeUnit.NANOSECONDS);
}
}
}
小结
性能分析是性能优化的前提,选择合适的工具和方法才能快速定位问题根源。