Java后台服务请求超时问题排查文档
通用型Java后台服务请求超时问题排查文档1 问题概述1.1 现象客户端调用后端接口TCP连接正常建立请求发送后长期无返回数据最终触发请求超时服务进程在线、无宕机崩溃、服务器资源看似正常长期运行后可能出现Java进程被系统OOM终止。1.2 适用范围SpringBoot/Java后端服务、Linux部署环境、JDK8、G1/默认GC、常规中间件架构MySQL/Redis。2 整体排查思路由外到内、从硬件→网络→中间件→服务进程→JVM→业务代码逐层排查先排除基础设施问题再定位应用层与JVM问题最后落地代码根因与修复。排查顺序服务器资源 → 网络连通性 → 中间件依赖 → 服务进程状态 → JVM线程 → GC状态 → 内存泄漏 → 代码问题。3 分步排查流程3.1 服务器基础资源排查核心目的排除CPU、内存、负载、IO、系统瓶颈topfree-hdf-h排查要点CPU利用率、系统负载、空闲占比物理内存、可用内存、Swap占用情况磁盘空间、磁盘IO是否打满。判定标准CPU空闲充足、内存无溢出、Swap无大量占用、磁盘正常排除服务器资源瓶颈。3.2 网络与连接层排查核心目的排除防火墙、端口、TCP连接、链路阻塞问题端口与连通性验证curl-v接口地址:端口/请求路径观察三次握手是否成功、是否卡在「等待服务端响应」阶段。TCP连接状态检查ss-snetstat-anp排查要点ESTABLISHED、TIME_WAIT、CLOSE_WAIT 数量是否异常端口监听正常、无连接耗尽、无网络队列溢出。判定标准TCP连接正常、端口放行、无网络丢包/拦截锁定问题在服务应用内部。3.3 第三方中间件排查核心目的排除数据库、缓存等依赖阻塞导致接口超时MySQL 排查showprocesslist;showengineinnodbstatus\G;检查长事务、慢查询、行锁/表锁、大量Sleep僵死连接。Redis 排查redis-cli info redis-cli--latency检查客户端连接、大Key、阻塞命令、网络延迟、内存占用。判定标准中间件无慢查询、无锁等待、无阻塞排除依赖组件导致的响应缓慢。3.4 应用服务进程状态排查核心目的确认服务是否正常运行、无僵死、无异常挂起# 查看服务运行状态systemctl status 服务名# 查看Java进程ps-ef|grepjava排查要点服务运行状态、启动时长、是否频繁重启进程存活、线程数量、进程资源占用。3.5 JVM线程栈排查核心目的定位业务线程是否死锁、阻塞、排队jstack 进程PIDthread.log分析重点Web容器工作线程Tomcat/Netty状态WAITING/BLOCKED/RUNNABLE是否存在大量线程阻塞、死锁、资源等待业务线程是否全部空闲无任务处理。典型异常GC线程持续高占用业务线程被STW暂停无法处理请求。3.6 JVM GC 专项排查超时高频根因核心目的确认是否因垃圾回收异常导致服务暂停jstat-gcutil进程PID10005关键观测指标新生代、老年代内存使用率YGC/FGC 次数、GC总耗时元空间Metaspace占用。异常特征老年代使用率 95%、元空间临近耗尽频繁FullGC、GC耗时极长、GC反复回收无法释放内存形成FullGC死循环全局STW暂停所有业务线程接口无响应超时。3.7 内存泄漏定位排查核心目的解决堆内存持续上涨、GC回收无效问题导出堆快照保留现场jmap-dump:formatb,file/tmp/heap.hprof 进程PID命令行快速分析内存对象jmap-histo进程PID|head-30泄漏定位方法查看实例数庞大、内存占用过高的自定义对象、工具类、解析类排除系统基础类重点关注XML/XPath解析、HTTP工具类、无界集合、本地缓存、定时任务对象区分临时对象波动与长期累积无法回收的泄漏对象。4 通用问题根因总结表层现象接口连通正常但无响应、服务不宕机、超时报错。底层根因业务代码存在隐性内存泄漏→ 堆内存持续上涨 → 老年代占满 → 频繁FullGC → STW全局暂停 → 接口处理阻塞超时。高频泄漏场景循环/接口内频繁创建XML、XPath、文档解析器未复用工具类、连接池、工厂类对象静态集合无过期清理、本地缓存无限制定时任务长期运行对象只创建不回收。5 通用解决方案5.1 应急修复快速恢复业务# 重启服务清空JVM堆内存临时解决GC与内存溢出systemctl restart 服务名5.2 代码永久优化根治内存泄漏重量级对象全局单例工厂类、解析器、连接工厂、客户端工具类使用static全局单例禁止每次请求/循环new新建。资源手动释放IO流、文档解析、连接资源使用完毕主动close、关闭资源、销毁句柄。限制集合与缓存本地Map/List缓存设置最大容量、过期淘汰策略禁止无界存储。定时任务优化避免定时任务内循环创建大对象、线程资源统一复用实例。5.3 JVM参数优化增强容错-Xms16g -Xmx16g -XX:MetaspaceSize512m -XX:MaxMetaspaceSize1g -XX:UseG1GC -XX:MaxGCPauseMillis200合理规划堆内存、元空间大小优化GC回收策略降低STW影响。6 标准化预防机制监控告警接入JVM监控配置老年代使用率、FullGC次数、GC耗时、堆内存水位告警。代码规范禁止在循环、接口方法、定时任务中频繁创建重量级对象工具类、解析工厂、客户端统一单例管理。日常巡检定期使用jstat、jmap、jstack线上巡检提前发现隐性内存泄漏。测试覆盖压测、长稳测试提前暴露长期运行后的内存溢出问题。7 通用排查命令清单# 系统资源topfree-h# 网络连接ss-scurl-v接口地址# 服务进程ps-ef|grepjavasystemctl status 服务名# JVM 线程GC堆分析jstack PID jstat-gcutilPID10003jmap-histoPID jmap-dump:formatb,fileheap.hprof PID