温馨提示×

Linux下Java如何进行性能监控

小樊
32
2025-12-14 03:20:22
栏目: 编程语言

Linux下Java性能监控实操指南

一 快速定位流程

  • 确认目标进程:用jps -lps -ef | grep java拿到PID
  • 看系统资源:用top -c -p 观察CPU占用;用vmstat 2查看r(运行队列)si/so(换入换出)、**cs(上下文切换)**等系统瓶颈信号。
  • 看JVM层面:用jstat -gc 1000观察GC频率与耗时;内存吃紧时用**jmap -heap jmap -dump:format=b,file=heap.hprof **抓取堆信息。
  • 线程与锁:用jstack > thread_dump.txt抓取线程栈,排查死锁/阻塞/长时间运行线程
  • 可视化与深入:本地可用JConsole/JVisualVM;远程通过JMX连接;或用jcmd help统一执行诊断命令(如Thread.printGC.heap_dump)。

二 常用工具与命令一览

工具 作用 典型命令
top / htop 实时查看进程CPU、内存 top -c -p
vmstat 系统级CPU、内存、IO、上下文切换 vmstat 2
jps 列出Java进程与PID jps -l
jstat JVM内存与GC统计 jstat -gc 1000
jstack 线程栈快照,定位死锁/阻塞 jstack > td.txt
jmap 堆内存概要与堆转储 jmap -heap ;jmap -dump:format=b,file=heap.hprof
jcmd 一站式诊断(线程、堆、GC、系统属性) jcmd Thread.print;jcmd GC.heap_dump filename=d.hprof
JConsole / JVisualVM 图形化监控与CPU/内存/线程分析、堆转储分析 jconsole;jvisualvm
远程JMX 远程监控与诊断 -Dcom.sun.management.jmxremote.port=8777 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false

三 CPU与内存问题排查步骤

  • CPU飙高
    1. 用**top -H -p **定位占用最高的线程ID(LWP)。
    2. 将线程ID转为十六进制:printf “0x%x\n”
    3. 用**jstack | grep -A 30 <十六进制ID>**查看对应线程栈,识别热点方法或阻塞点。
    4. 若怀疑锁竞争,结合vmstatcs(上下文切换)与pidstat -w观察让步式切换是否异常升高。
  • 内存吃紧或疑似泄漏
    1. jstat -gc 1000观察Eden/Survivor/Old使用与FGC/YGC次数与耗时,判断是否频繁Full GC。
    2. jmap -heap 快速看各代容量与使用情况;必要时jmap -dump导出heap.hprof,用VisualVM/MAT分析对象占比与引用链。
    3. 若系统出现si/so > 0的换入换出,说明物理内存紧张,需结合堆大小与应用内存需求综合调优。

四 远程与持续监控方案

  • JMX远程监控
    启动参数加入:
    -Dcom.sun.management.jmxremote.port=8777
    -Dcom.sun.management.jmxremote.ssl=false
    -Dcom.sun.management.jmxremote.authenticate=false
    netstat -ntlp | grep 8777确认监听,再用本机jvisualvm添加远程主机与JMX连接进行监控与堆转储。
  • Prometheus + JMX Exporter + Grafana
    将JVM指标通过JMX Exporter暴露为**/metrics**,由Prometheus采集,Grafana做可视化与告警,适合容器与K8s环境。
  • APM与低开销采样
    引入SkyWalking(分布式追踪)、Arthas(在线诊断,无需重启)、async-profiler(低开销采样,生产友好)等,覆盖方法级耗时、调用链与热点定位。

五 实用命令清单

  • 进程定位:
    • jps -l
    • ps -ef | grep java
  • 系统资源:
    • top -c -p
    • vmstat 2
  • JVM监控与诊断:
    • jstat -gc 1000
    • jstack > thread_dump.txt
    • jmap -heap
    • jmap -dump:format=b,file=heap.hprof
    • jcmd help
    • jcmd Thread.print
    • jcmd GC.heap_dump filename=heap.hprof
  • 远程JMX:
    • 启动参数加入:-Dcom.sun.management.jmxremote.port=8777 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false
    • netstat -ntlp | grep 8777

0