【系统响应慢排查所需命令】ps -ef、grep、jstat、pmap 、sort 、head 、jmap 、dump.hprof

列出所有进程,找到需要的进程id【ps -ef】

  • UID: 进程所属的用户 ID。

  • PID: 进程 ID。

  • PPID: 父进程 ID。

  • C: CPU 使用率。

  • STIME: 进程启动的时间。

  • TTY: 与进程关联的终端。

  • TIME: 进程占用的 CPU 时间。

  • CMD: 启动进程的命令。

假如是搜索功能缓慢,就用查看符合条件的进程【查询包含字符串"search"的进程】【ps -ef | grep search】

查看search 服务的gc情况【查询进程id 31665 的 gc 情况】【jstat -gc 31665】

此时如果发现年轻代或老年代 gc 频率很高,那么此时就需要分析此时内存堆上的对象都是哪些

  • S0C: Survivor 0 区的当前容量(KB)。

  • S1C: Survivor 1 区的当前容量(KB)。

  • S0U: Survivor 0 区的当前使用量(KB)。

  • S1U: Survivor 1 区的当前使用量(KB)。

  • EC: Eden 区的当前容量(KB)。

  • EU: Eden 区的当前使用量(KB)。

  • OC: 老年代的当前容量(KB)。

  • OU: 老年代的当前使用量(KB)。

  • MC: 元数据区的当前容量(KB)。

  • MU: 元数据区的当前使用量(KB)。

  • CCSC: 压缩类空间的当前容量(KB)。

  • CCSU: 压缩类空间的当前使用量(KB)。

  • YGC: 年轻代垃圾回收的次数。

  • YGCT: 年轻代垃圾回收的总时间(秒)。

  • FGC: 完全垃圾回收的次数。

  • FGCT: 完全垃圾回收的总时间(秒)。

  • GCT: 垃圾回收的总时间(秒)。

jstat 这个命令主要是查看gc 、内存相关的信息【jstat -option】,以下是jstat 支持的选项

  1. -class: 显示类加载器的行为统计信息。

  2. -compiler: 显示 JIT 编译器的行为统计信息。

  3. -gc: 显示垃圾回收的统计信息,包括各个内存池的使用情况和垃圾回收的时间。

  4. -gccapacity: 显示各个内存池的容量和占用情况。

  5. -gccause: 显示最近一次和当前的垃圾回收事件的原因。

  6. -gcmetacapacity: 显示元数据空间的容量和占用情况。

  7. -gcnew: 显示新生代垃圾回收的统计信息。

  8. -gcnewcapacity: 显示新生代内存池的容量和占用情况。

  9. -gcold: 显示老年代垃圾回收的统计信息。

  10. -gcoldcapacity: 显示老年代内存池的容量和占用情况。

  11. -gcutil: 显示垃圾回收的汇总统计信息,包括内存使用百分比和垃圾回收时间百分比。

  12. -printcompilation: 显示 JIT 编译的方法统计信息。

例如用第11个举例【jstat -gcutil 31665】

  • S0: Survivor 0 区的使用百分比。

  • S1: Survivor 1 区的使用百分比。

  • E: Eden 区的使用百分比。

  • O: 老年代的使用百分比。

  • M: 元数据区的使用百分比。

  • CCS: 压缩类空间的使用百分比。

  • YGC: 年轻代垃圾回收的次数。

  • YGCT: 年轻代垃圾回收的总时间(秒)。

  • FGC: 完全垃圾回收的次数。

  • FGCT: 完全垃圾回收的总时间(秒)。

  • GCT: 垃圾回收的总时间(秒)。

查询内存中的大对象 按对象大小降序【pmap -x 31665 |sort -k 2 -r -n | head -n 100】

【这块我觉得有点鸡肋,因为这块就算看到了有大对象也不知道是哪行代码创建的】

复制代码
把进程id31665 所在堆 的dump。hprof 下载下来【jmap -dump:live,format=b,file=heapdump.hprof 31665】

dump.hprof 可以用以下工具分析

用在线网站分析Brilliant Graphs, metrics and java heap dump analysis anti-patterns reported

用jdk 自带的

idea里的【先在插件里安装jprofiler】

eclipse里也有【此处省略,因为我不用eclipse】

死锁排查:

查看进程中各个线程状态和代码行数【jstack 31665】

可以看出哪行代码造成了死锁问题

这个命令一打印就打印一堆,眼睛看不过来

解决办法:将线程堆栈跟踪信息保存到 thread_dump.txt 文件中。

查找所有处于 BLOCKED 状态的线程,并统计每个线程等待的锁的数量,输出前 10 个。

root@beideng-nj-qa-java-test-03 \~# jstack 31665 > thread_dump.txt

root@beideng-nj-qa-java-test-03 \~# grep "waiting for monitor entry" thread_dump.txt | awk '{print $1}' | sort | uniq -c | sort -nr | head -n 10

后续继续补充其他命令。。。记得点赞收藏

相关推荐
戴西软件20 分钟前
制造研发中的AI视觉与仿真:戴西工程图纸智能审图智能体、戴西3DViz_CAE AI集成与戴西3DViz_CAD AI集成
大数据·运维·人工智能·3d·自动化·制造·rpa
苏宸啊28 分钟前
Reactor反应堆模式
linux
javaDocker38 分钟前
1800 亿科技投入砸下去,多数机构平的只是服务器,不是能力
运维·服务器·人工智能·科技·研发效能·金融科技
服务器硬件项目经理1 小时前
超节点修仙录 目 录
服务器·硬件工程·硬件
骇客野人1 小时前
Linux 全套实操方案(含目录详解、文件传输、日志、文件规范、环境变量、Java 应用部署运维)
java·linux·运维
_菜鸟果果1 小时前
高德地图 JS API 2.0 在国产 Linux/ARM 电脑上渲染失败 的排查与解决
linux·开发语言·javascript
GeW1 小时前
飞行汽车交付阿联酋,真正先“起飞”的是低空数据基座——红帽Linux与数据库高可用为什么成了低空运营的隐形跑道
linux
eleven_4u2 小时前
RocketMQ相关问题
java·运维·中间件
0+1112 小时前
Linux --DNS与ICMP
linux·运维·服务器
我命由我123452 小时前
5-1.Python 编码进阶 - 函数进阶(参数、返回值、递归、函数作为参数传递、lambda 匿名函数)
java·服务器·数据库·后端·python·java-ee·python3.11