Java应用线上故障排查与优化实战指南

张开发
2026/4/14 1:36:44 15 分钟阅读

分享文章

Java应用线上故障排查与优化实战指南
文章目录Java应用线上故障排查与优化实战指南一、快速响应机制与流程1.1 故障分级与响应机制1.2 诊断工具箱标准化二、内存泄漏深度排查2.1 内存泄漏诊断流程2.2 实战:MAT内存分析2.3 内存分析脚本与工具2.4 eBPF内存泄漏检测三、线程阻塞与死锁排查3.1 线程问题诊断矩阵3.2 实战:死锁检测与分析3.3 线程分析自动化脚本3.4 使用strace分析系统调用阻塞四、代码部署流程优化4.1 自动化部署流水线设计4.2 蓝绿部署与回滚策略4.3 性能基准测试与对比五、eBPF高级监控与诊断5.1 eBPF全方位监控系统5.2 eBPF数据收集与分析平台六、总结与最佳实践6.1 故障排查SOP清单6.2 性能优化检查表6.3 持续改进机制6.4 关键成功因素Java应用线上故障排查与优化实战指南一、快速响应机制与流程1.1 故障分级与响应机制# incident-response.yaml故障级别:P0-紧急:标准:核心功能不可用,影响所有用户响应:5分钟内响应,30分钟内恢复参与:值班SRE+开发负责人+架构师P1-严重:标准:主要功能降级,影响30%用户响应:10分钟内响应,2小时内恢复参与:值班SRE+开发组长P2-一般:标准:非核心功能异常,影响10%用户响应:30分钟内响应,24小时内修复参与:值班SRE+开发人员响应流程:1. 告警接收:通过PagerDuty/钉钉/企业微信2. 故障确认:查看监控指标,验证问题3. 紧急止血:重启、扩容、限流、降级4. 根因分析:使用诊断工具定位问题5. 修复上线:热修复/滚动发布6. 复盘改进:编写故障报告,优化流程1.2 诊断工具箱标准化# diagnostics-kit.sh#!/bin/bash# 一键收集诊断信息工具set-eDIAG_DIR="/tmp/diagnostics_$(date+%Y%m%d_%H%M%S)"mkdir-p$DIAG_DIR# 1. 系统级信息collect_system_info(){echo"收集系统信息..."top-b-n1$DIAG_DIR/top.txtvmstat15$DIAG_DIR/vmstat.txt iostat-dx15$DIAG_DIR/iostat.txtdmesg-T$DIAG_DIR/dmesg.txtnetstat-tunlp$DIAG_DIR/netstat.txt ss-tunap$DIAG_DIR/ss.txt sar-nDEV15$DIAG_DIR/sar_network.txtfree-m$DIAG_DIR/free.txtdf-h$DIAG_DIR/df.txtpsauxf$DIAG_DIR/ps.txt}# 2. JVM进程信息collect_jvm_info(){localpid=$1echo"收集JVM进程$pid信息..."# 基础信息jps-lv$DIAG_DIR/jps.txt jinfo$pid$DIAG_DIR/jinfo_$pid.txt21# GC信息jstat-gcutil$pid100010$DIAG_DIR/jstat_gc_$pid.txtjstat-gccapacity$pid$DIAG_DIR/jstat_capacity_$pid.txt# 堆转储(谨慎使用)if["$HEAP_DUMP"="true"];thenjmap -dump:live,format=b,file=$DIAG_DIR/heap_$pid.hprof$pidelsejmap-heap$pid$DIAG_DIR/jmap_heap_$pid.txt jmap-histo$pid$DIAG_DIR/jmap_histo_$pid.txtfi# 线程堆栈foriin{1..3};dojstack$pid$DIAG_DIR/jstack_${pid}_${i}.txtsleep2done# 原生内存pmap-x$pid$DIAG_DIR/pmap_$pid.txt}# 3. 高级诊断collect_advanced_info(){localpid=$1echo"收集高级诊断信息..."# strace系统调用跟踪(采样)timeout10strace-c-p$pid21$DIAG_DIR/strace_cpu_$pid.txttimeout10strace-etrace=network,file-p$pid21$DIAG_DIR/strace_io_$pid.txt# perf性能分析perf record-F99-p$pid-g--sleep10perf report--stdio$DIAG_DIR/perf_report_$pid.txt perf script$DIAG_DIR/perf_script_$pid.txt# eBPF/BCC工具ifcommand-vbcc;then/usr/share/bcc/tools/offcputime-p$pid5$DIAG_DIR/offcputime_$pid.txt /usr/share/bcc/tools/execsnoop-p$pid5$DIAG_DIR/execsnoop_$pid.txt /usr/share/bcc/tools/opensnoop-p$pid5$DIAG_DIR/opensnoop_$pid.txtfi}# 4. 应用日志collect_logs(){echo"收集应用日志..."journalctl-ujava-app--since"5 minutes ago"$DIAG_DIR/journalctl.txttail-n1000/var/log/java-app/app.log$DIAG_DIR/app_log.txttail-n1000/var/log/java-app/gc.log$DIAG_DIR/gc_log.txt}# 主流程main(){APP_PID=$(pgrep-f"java.*myapp")if[-z"$APP_PID"];thenecho"未找到Java进程"exit1fiecho"诊断目标进程:$APP_PID"collect_system_info collect_jvm_info$APP_PIDcollect_advanced_info$APP_PIDcollect_logs# 打包tar-czf$DIAG_DIR.tar.gz$DIAG_DIRecho"诊断包已生成:$DIAG_DIR.tar.gz"# 生成报告摘要generate_summary}generate_summary(){cat$DIAG_DIR/summary.mdEOF # 故障诊断报告摘要 - 时间:$(date)- 进程PID:$APP_PID- 系统负载:$(cat$DIAG_DIR/top.txt|head-1)- 内存使用:$(grep"Mem:"$DIAG_DIR/free.txt)- JVM GC情况:$(tail-1$DIAG_DIR/jstat_gc_$APP_PID.txt)- 线程状态统计:$(grepjava.lang.Thread.State $DIAG_DIR/jstack_${APP_PID}_1.txt|sort|uniq-c)EOF}main"$@"二、内存泄漏深度排查2.1 内存泄漏诊断流程OOM内存缓慢增长内存异常告警确认现象分析hs_err_pid.log监控堆内存趋势分析崩溃线程栈查看内存分配大小实时GC监控堆直方图分析定位泄漏对象生成堆转储MAT/JProfiler分析定位GC Roots引用链确定泄漏代码位置修复与验证2.2 实战:MAT内存分析// 内存泄漏典型模式示例publicclassMemoryLeakExample{// 1. 静态集合引起的内存泄漏privatestaticfinalMapString,ObjectCACHE=newHashMap();publicvoidaddToCache(

更多文章