工具相关 jvm分析工具

jvm分析工具

工具相关 / 工具相关/采集/jvm分析工具.md

查找java进程:

text
jps

ps -ef | grep  java
seeyon/资料整理/工具相关/images/jps命令图.png
jps命令图.png

1、线程堆栈采集

bash
 - 基本线程堆栈 
 jstack <pid> > thread_dump_$(date +%s).txt 
 
 - 线程堆栈(包含锁信息) 
 jstack -l <pid> > thread_dump_locks_$(date +%s).txt 

2、GC频率采集

bash
- 1. GC统计摘要(最常用)
jstat -gcutil pid time
- 输出格式:S0 S1 E O M CCS YGC YGCT FGC FGCT GCT

- 案例:jstat -gcutil <pid> 1000 10
每1秒采集一次,共采集10次
 
- 输出结果参数说明:
S0:年轻代中第一个survivor(幸存区)已使用的占当前容量百分比
S1:年轻代中第二个survivor(幸存区)已使用的占当前容量百分比
E:年轻代中Eden(伊甸园)已使用的占当前容量百分比
O:old代已使用的占当前容量百分比
P:perm代已使用的占当前容量百分比
M:method方法区已使用的占当前容量百分比
YGC(young GC count):从程序启动到采样时年轻代垃圾回收次数
YGCT(young GC time):从程序启动到采样时年轻代垃圾回收所用的时间(s)
FGC(full GC count):从程序启动到采样时old代(全gc)次数
FGCT:从程序启动到采样时old代所用的时间(s)
GCT:从应用程序启动到采样时所有gc用的总时间(s)
bash
- 2. 详细GC统计
- 输出各区域容量和使用量
jstat -gc pid time count
pid:进程号
time:采集间隔时间毫秒
count:采集次数,不输入则一直采集

- 案例: jstat -gc <pid> 1000 5

- 输出显示内容说明如下:
S0C(survivor 0 capcity):年轻代中第一个survivor(幸存区)的容量(KB)
S1C:年轻代中第二个survivor(幸存区)的容量(KB)
S0U(survivor 0 used):年轻代中第一个survivor目前已经使用的空间(KB)
S1U:年轻代中第二个survivor目前已经使用的空间(KB)
EC:年轻代中Eden(伊甸园)的容量(KB)
EU:年轻代中Eden目前已经使用空间(KB)
OC:Old代的容量(KB)
OU:Old代目前已经使用的空间(KB)
PC:Perm(永久代)的容量(KB)–java7及之前使用Perm名称,主要用来存储字节码,基本上不参与GC分配。
PU:Perm(永久代)目前已使用的空间(KB)–java7及之前使用Perm名称
MC:方法区的容量(KB)–java8之后叫做方法区和Perm类似,主要用来存储字节码,基本上不参与GC分配。
MU:方法区目前已使用的空间(KB)
CCSC(compress class space capcity):压缩类空间容量(KB)
CCSU:压缩空间目前已使用大小(KB)
YGC(young GC count):从程序启动到采样时年轻代垃圾回收次数
YGCT(young GC time):从程序启动到采样时年轻代垃圾回收所用的时间(s)
FGC(full GC count):从程序启动到采样时old代(全gc)次数
FGCT:从程序启动到采样时old代所用的时间(s)
GCT:从应用程序启动到采样时所有gc用的总时间(s) 
bash
- 3. GC事件监控
jstat -gccause <pid> 2000
 显示GC原因

- 4. 类加载统计
jstat -class <pid> 1000

3、堆内存分析

bash
- 1. 堆直方图(按对象数量排序)
jmap -histo <pid> > heap_histo_$(date +%s).txt

- 2. 堆直方图(包含存活对象)
jmap -histo:live <pid> > heap_histo_live_$(date +%s).txt

- 3. 堆摘要信息
jmap -heap <pid> > heap_summary_$(date +%s).txt

- 4. 生成堆转储(谨慎使用,文件较大)
jmap -dump:live,format=b,file=heap_dump_$(date +%s).hprof <pid>

- 5. 生成堆转储(只包含前N个类)
jmap -histo:live <pid> | head -20 > top20_classes.txt

4、性能分析(火焰图)

bash
- 1. 安装async-profiler
wget https://github.com/async-profiler/async-profiler/releases/download/v4.3/async-profiler-4.3-linux-x64.tar.gz
tar -xzf async-profiler-4.3-linux-x64.tar.gz
cd async-profiler-4.3-linux-x64

- 2. CPU火焰图
./profiler.sh -d 30 -f cpu_flame.html <pid>
./asprof -d 30 -f cpu_flame.html 3692397
 -d: 持续时间(秒)
 -f: 输出文件
 --title: 图表标题

- 3. 内存分配火焰图
./profiler.sh -d 30 -e alloc -f alloc_flame.html <pid>
./asprof -d 10 -e alloc -f alloc_flame.html 3692397
 -e: 事件类型(alloc表示内存分配)

- 4. 锁竞争火焰图
./profiler.sh -d 30 -e lock -f lock_flame.html <pid>
./asprof -d 10 -e lock -f lock_flame.html 3692397

- 5. 综合采集(CPU+内存+锁)---
./profiler.sh -d 60 -e cpu,alloc,lock -f comprehensive_flame.html <pid>

- 6. 输出为Collapsed格式(用于生成火焰图)
./profiler.sh -d 30 -o collapsed -f cpu.collapsed <pid>

- 7. 实时监控模式
./profiler.sh start <pid>
sleep 30
./profiler.sh stop -f realtime_flame.html <pid>

5、系统资源监控

bash
- 1. 查看指定进程
top -p <pid>

- 2. 按CPU排序
top -p <pid> -o %CPU

- 3. 按内存排序
top -p <pid> -o %MEM

- 4. 批处理模式(用于脚本)
top -b -n 1 -p <pid>

- 5. 监控线程级别
top -H -p <pid>

- 6. 自定义输出格式
top -p <pid> -b -n 1 | grep -A 10 "PID"

- 7. 持续监控并保存
top -b -d 1 -p <pid> > top_monitor_$(date +%s).log

部分场景下 可能没有 -p / -H 等参数,则可直接使用 top命令查看基本信息

6、内存信息(基础内存信息)

bash
- 注意:jcmd不同版本jdk可能支持不同,同时需要相关的启动参数支持

- 查看特定进程可用的命令
jcmd <pid> help

- 1. 如:获取JVM内存概览(最全面)
jcmd <pid> VM.info

- 2.  如:获取Native内存跟踪(NMT)
jcmd <pid> VM.native_memory summary
jcmd <pid> VM.native_memory detail
jcmd <pid> VM.native_memory baseline
jcmd <pid> VM.native_memory summary.diff

- 3.  如:获取GC堆信息
jcmd <pid> GC.heap_info

- 4.  如:获取类加载器统计
jcmd <pid> GC.class_histogram
jcmd <pid> GC.class_stats

- 5.  如:获取运行时参数
jcmd <pid> VM.flags
jcmd <pid> VM.system_properties