1.JVM线上环境常见故障类型:
- JVM内存泄漏:长时间运行后,内存使用量持续增加。
- JVM内存溢出(OOM):内存分配超出JVM堆空间限制。
- 业务线程死锁:多个线程因竞争资源而相互等待,无法继续执行。
- 应用程序异常宕机:由于各种原因,如GC频繁、内存溢出等,应用非正常终止。
- 线程阻塞/响应速度变慢:线程在执行过程中遇到阻塞,导致服务响应延迟。
- CPU利用率飙升或100%:某些进程或线程占用大量CPU资源。
2.排查思路:
- 分析问题:利用经验和理论缩小问题范围。
- 排查问题:根据可疑性逐一排查。
- 定位问题:利用监控数据精确定位问题原因。
- 解决问题:确定问题后采取措施解决。
- 尝试最优解:在能力范围内寻求最佳解决方案。
3.工具使用:
- jps:查看Java进程。
- jinfo:查看和调整JVM参数。
- jstat:监控JVM资源和性能。
- jmap:生成堆Dump文件,分析内存使用。
- jhat:分析堆Dump文件。
- jstack:生成线程快照,定位线程问题。
4.故障排查方向:
- 应用程序本身问题:代码缺陷、资源使用不当等。
- 上下游系统问题:服务依赖问题导致连锁反应。
- 部署机器问题:硬件故障、网络问题等。
- 第三方RPC调用问题:调用者或被调用者出现问题。
5.故障排查实战:
- 内存溢出(OOM):通过设置JVM参数自动导出堆Dump文件,使用MAT等工具分析。
- 内存泄漏:通过监控工具发现内存持续增长,分析代码逻辑。
- 死锁问题:使用jstack等工具分析线程状态,定位死锁代码。
- 应用宕机:使用keepalived等工具监控应用状态,自动重启服务。
- 线程阻塞/响应慢:分析系统日志、监控数据,优化代码和资源配置。
- CPU利用率高:使用top命令和jstack工具定位高CPU消耗线程,优化代码。
6.总结:
线上排查需要结合经验、工具和理性思维。通过分析、排查、定位和解决问题的步骤,可以高效地处理线上环境中的各类故障。开发者应不断积累经验,学习使用各种工具,形成自己的排查方法论。
分析问题、排查问题、定位问题、解决问题、尝试最优解。
原文链接:juejin.cn/post/7312431790713929763