java如何排查线上问题

news/2025/2/23 10:41:41

在Java线上环境中排查故障需要系统化的方法和合适的工具,以下是详细的排查步骤及常用工具:


快速确认问题现象

  • 明确症状:确认是CPU飙升、内存泄漏、线程阻塞、响应超时,还是频繁Full GC。

  • 查看监控:使用Prometheus、Grafana、Zabbix等工具查看系统指标(CPU、内存、线程、GC次数、请求量等)。

  • 检查日志:通过ELK(Elasticsearch、Logstash、Kibana)或分布式日志系统搜索错误日志(如ERRORException)。


1. CPU占用过高

  • 定位高CPU线程

    jps -l         # 查看java 进程 获取pid
    top -H -p <pid>         # 查看进程内各线程CPU占用
    printf "%x\n" <tid>     # 将线程ID转为16进制(用于jstack分析)
    jstack <pid> > thread.txt
    • thread.txt中搜索nid=0x<16进制线程ID>,查看线程堆栈。

  • 工具辅助

    • Arthas:使用thread -n 3查看最忙的3个线程。

    • Async-Profiler:生成火焰图定位热点代码。


2. 内存泄漏/OOM

  • 查看内存分布

    jmap -heap <pid>        # 堆内存概况
    jstat -gcutil <pid>     # GC统计(关注老年代占用)
  • 导出堆快照

    jmap -dump:live,format=b,file=heap.hprof <pid>
    • 使用 Eclipse MATVisualVM 分析heap.hprof,查找Retained Heap最大的对象。

  • Arthas内存分析

    dashboard                 # 实时内存监控
    heapdump --live /tmp/heap.hprof  # 导出堆快照

3. 线程阻塞/死锁

  • 查看线程状态

    jstack <pid> > thread.txt
    • 搜索BLOCKEDWAITING状态的线程,分析代码锁竞争。

  • Arthas快速诊断

    thread -b              # 直接定位死锁线程
    thread --state BLOCKED # 查看阻塞线程

4. 响应缓慢

  • 链路分析

    • 使用分布式追踪工具(SkyWalking、Zipkin)查看请求链路耗时。

  • 数据库慢查询

    • 开启MySQL慢查询日志,或使用Arthas的watch命令监控SQL执行时间:

      watch com.mysql.jdbc.ConnectionImpl executeQuery "{params, returnObj}" -x 3
  • 代码级瓶颈

    • Arthas Profiling

      profiler start          # 开始采样
      profiler stop --format html  # 生成火焰图

5. 频繁Full GC

  • 检查GC日志

    • JVM参数添加 -Xloggc:gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps

    • 使用 GCViewerGCEasy 分析GC日志,观察老年代回收效率。

  • 常见原因

    • 内存泄漏(通过堆快照分析)。

    • JVM参数不合理(如堆大小、Survivor区比例)。


6. 网络与I/O问题

  • 连接池耗尽

    • 检查数据库连接池(如HikariCP)配置,使用jstack查看等待连接的线程。

  • 网络延迟

    • 使用tcpdump或Wireshark抓包分析。

    • Arthas网络诊断

      trace java.net.SocketInputStream socketRead

辅助工具清单

工具用途
jstack线程堆栈分析(死锁、阻塞)
jmap内存快照导出
Arthas在线诊断(动态反编译、监控方法执行)
VisualVM本地JVM监控与堆分析
Eclipse MAT内存泄漏分析
Async-Profiler低开销火焰图生成

 预防与最佳实践

  • 提前埋点:关键方法添加Trace ID,方便日志追踪。

  • 灰度发布:逐步验证新版本,减少全局风险。

  • 压测与预案:定期全链路压测,准备限流、降级策略。


通过以上步骤,结合日志、监控和工具,可以高效定位并解决大多数Java线上故障。


http://www.niftyadmin.cn/n/5863333.html

相关文章

C/C++跳动的爱心

系列文章 序号直达链接1C/C李峋同款跳动的爱心2C/C跳动的爱心3C/C经典爱心4C/C满屏飘字5C/C大雪纷飞6C/C炫酷烟花7C/C黑客帝国同款字母雨8C/C樱花树9C/C奥特曼10C/C精美圣诞树11C/C俄罗斯方块小游戏12C/C贪吃蛇小游戏13C/C孤单又灿烂的神14C/C闪烁的爱心15C/C哆啦A梦16C/C简单…

MySQL要点总结一

大纲 一.InnoDB的内存结构和更新机制 二.InnoDB的存储模型 三.并发事务原理 四.索引原理和索引优化 一.InnoDB的内存模型 1.SQL的执行流程 2.InnoDB的内存模型 3.Buffer Pool中的空闲缓存页与free链表 4.Buffer Pool中的脏页和flush链表 5.Buffer Pool通过LRU链表来淘…

antv G6绘制流程图

效果图&#xff08;优点&#xff1a;可以自定义每一条折线的颜色&#xff0c;可以自定义节点的颜色&#xff0c;以及折线的计算样式等&#xff09;&#xff1a; 代码&#xff1a; <!-- 流程图组件 --> <template><div id"container"></div>…

前端面试-JavaScript 数据类型详解

目录 一、数据类型分类 二、核心区别对比 1. 存储方式 2. 比较方式 3. 类型检测方法 三、特殊类型详解 1. Symbol 2. BigInt 3. null vs undefined 四、常见面试扩展问题 五、总结 一、数据类型分类 JavaScript 数据类型分为 基本数据类型&#xff08;原始类型&…

hot100_74. 搜索二维矩阵

hot100_74. 搜索二维矩阵 思路 给你一个满足下述两条属性的 m x n 整数矩阵&#xff1a; 每行中的整数从左到右按非严格递增顺序排列。 每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target &#xff0c;如果 target 在矩阵中&#xff0c;返回 true &#xff1b;否…

网络空间安全(2)应用程序安全

前言 应用程序安全&#xff08;Application Security&#xff0c;简称AppSec&#xff09;是一个综合性的概念&#xff0c;它涵盖了应用程序从开发到部署&#xff0c;再到后续维护的整个过程中的安全措施。 一、定义与重要性 定义&#xff1a;应用程序安全是指识别和修复应用程序…

二级公共基础之数据结构与算法篇(五)树和二叉树

目录 前言 一、树的基本概念 1.父结点和根节点 2.子节点和叶子节点 3.度和深度 4.子树 二、二叉树及其基本性质 1. 二叉树的定义 2. 二叉树的基本性质 性质1 性质2 性质3 性质4 性质5 性质6 三、二叉树的存储结构 四、二叉树的遍历 1.遍历二叉树的概念 1. 前…

基于ffmpeg+openGL ES实现的视频编辑工具-添加贴纸(八)

在当下丰富多元的音视频编辑应用领域,添加贴纸已然成为一项广受欢迎的功能,它能够为音视频作品注入独特的趣味与创意元素。本文将深入探究音视频添加贴纸背后所涉及的技术原理与实现路径。 一、技术原理概述 音视频从本质上来说,是由一系列连续的图像帧(针对视频部分)以…