Java性能数据收集指南
1. Java性能数据收集指南
1.1 性能指标分类
1.1.1 系统层面
-
CPU相关
- CPU使用率
- 用户态/内核态时间
- Load Average
- 上下文切换次数
-
内存相关
- 物理内存使用
- 交换空间使用
- 页面置换率
-
磁盘IO
- IOPS
- 吞吐量
- 响应时间
- 队列长度
-
网络
- 网络吞吐量
- 连接数
- 网络延迟
- 丢包率
1.1.2 JVM层面
-
堆内存
- 各代内存使用量
- GC频率和时间
- 对象分配率
-
线程
- 线程数量
- 线程状态分布
- 死锁检测
-
类加载
- 已加载类数量
- 类加载时间
- 元空间使用情况
1.2 数据收集工具
1.2.1 系统工具
- Linux常用命令
CPU信息
top -H -p <pid>
vmstat 1
mpstat -P ALL 1
内存信息
free -m
vmstat -s
IO信息
iostat -xz 1
iotop
网络信息
netstat -antp
sar -n DEV 1
- JDK工具
查看JVM进程
jps -mlv
查看GC情况
jstat -gcutil <pid> 1000
查看堆内存
jmap -heap <pid>
导出堆转储
jmap -dump:format=b,file=heap.bin <pid>
查看线程状态
jstack <pid>
1.2.2 可视化工具
- JVisualVM
- 配置启动参数
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=9999
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
- Arthas
- 常用命令
启动Arthas
java -jar arthas-boot.jar
线程分析
thread -n 3 # 显示前3个最忙的线程
thread -b # 找出当前阻塞其他线程的线程
内存分析
memory # 查看内存信息
heapdump # 导出堆转储文件
类加载分析
classloader # 查看类加载信息
1.3 性能数据收集方案
1.3.1 基础监控
monitor.sh - 基础监控脚本
系统信息收集
echo "=== System Info ===" > monitor.log
date >> monitor.log
uptime >> monitor.log
CPU使用率
echo "=== CPU Usage ===" >> monitor.log
top -bn1 | head -n 5 >> monitor.log
内存使用
echo "=== Memory Usage ===" >> monitor.log
free -m >> monitor.log
JVM信息
echo "=== JVM Info ===" >> monitor.log
jstat -gcutil $PID >> monitor.log
1.3.2 APM工具集成
- Spring Boot Actuator
<!-- pom.xml -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
- Prometheus + Grafana
prometheus.yml
crape_configs:
job_name: 'spring-boot'
metrics_path: '/actuator/prometheus'
static_configs:
targets: ['localhost:8080']
1.4 性能数据分析方法
1.4.1 CPU分析
- 高CPU使用率排查
找出CPU使用率最高的线程
top -Hp
转换线程ID为16进制
printf “%x\n” <thread_id>
查看线程栈
jstack | grep <hex_thread_id> -A 30
1.4.2 内存分析
- 堆内存分析
导出堆转储
jmap -dump:live,format=b,file=heap.dump <pid>
使用MAT分析
关注以下方面:
- 大对象
- 重复对象
- 内存泄漏
- GC分析
查看GC详细信息
jstat -gcutil <pid> 1000 10
分析GC日志
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-Xloggc:/path/to/gc.log
1335

被折叠的 条评论
为什么被折叠?



