1. JRE 命令行工具概述
作为一名长期奋战在一线的 Java 运维工程师,我深知排查线上问题时的焦虑与压力。当服务器 CPU 飙升、内存泄漏、线程死锁等问题突然出现时,掌握 JRE 内置的命令行工具就像拥有了一把瑞士军刀,能让你在最短时间内定位问题根源。
JRE 自带的这些工具无需额外安装,开箱即用,但很多开发者只熟悉其中一小部分功能。实际上,合理组合使用这些工具可以解决 90% 以上的 Java 应用性能问题。本文将基于我多年实战经验,带你深入掌握这些工具的实用技巧。
重要提示:所有工具都位于 JRE 的 bin 目录下,使用时请确保该目录已加入系统 PATH 环境变量。在 Linux 系统中,可以通过
echo $PATH检查,Windows 则可以在命令提示符中输入path查看。
2. 基础验证工具:java 命令详解
2.1 版本验证与基础运行
java 命令是 JRE 最核心的工具,除了运行程序外,它的参数选项对于问题排查也非常有用。最常用的当然是版本检查:
bash复制java -version
这个简单的命令能告诉你三件重要事情:
- JDK/JRE 的具体版本号
- 运行时环境类型(如 OpenJDK、Temurin 等)
- JVM 模式(Server/Client,32位/64位)
在实际运维中,我经常遇到因为环境版本不一致导致的问题。比如测试环境用 JDK 8 运行正常,生产环境用 JDK 11 却出现兼容性问题。这时 -version 就是第一个要检查的命令。
2.2 JVM 参数调优实战
运行 Java 程序时,合理配置 JVM 参数至关重要。以下是几个关键参数示例:
bash复制# 基础内存配置
java -Xms512m -Xmx2g -jar app.jar
# 指定垃圾回收器
java -XX:+UseG1GC -jar app.jar
# 开启GC日志记录
java -Xlog:gc*:file=gc.log -jar app.jar
经验分享:
-Xms和-Xmx应该设置为相同值,避免堆内存动态调整带来的性能开销- 生产环境一定要开启 GC 日志,这是后续排查内存问题的黄金依据
- 对于高吞吐量应用,G1 GC 通常比 Parallel GC 表现更好
2.3 查看默认 JVM 参数
想知道你的 JRE 默认使用哪些参数?这个命令非常有用:
bash复制java -XX:+PrintFlagsFinal -version
输出会包含数百个 JVM 参数及其默认值。当遇到奇怪的行为时,可以在这里检查相关参数的默认设置。
3. 进程管理工具:jps 高级用法
3.1 基础进程查看
jps 相当于 Java 版的 ps 命令,但专门针对 Java 进程。基本用法:
bash复制jps
输出示例:
code复制12345 MyApp
67890 Jps
第一列是 PID,第二列是主类名或 JAR 文件名。这个简单的命令在以下场景特别有用:
- 确认应用是否真的启动了
- 快速获取 Java 进程的 PID 以便后续分析
- 区分多个相似的 Java 进程
3.2 高级参数组合
jps 的真正威力在于它的参数组合:
bash复制# 显示完整主类名和JVM参数
jps -lv
# 显示传递给main方法的参数
jps -lm
实战技巧:
- 使用
-lv可以验证应用是否使用了预期的 JVM 参数启动 - 当同一个 JAR 以不同参数启动多个实例时,
-lm能帮你区分它们 - 结合
grep可以快速过滤特定应用:jps | grep MyApp
4. 可视化监控工具:jconsole 实战指南
4.1 基础监控
jconsole 是 Java 自带的图形化监控工具,启动方式很简单:
bash复制jconsole
它会自动列出本机所有 Java 进程,选择目标进程即可连接。对于远程监控,需要目标 JVM 开启 JMX 远程连接支持。
4.2 关键监控指标
在 jconsole 界面中,这几个标签页最为重要:
-
内存:观察堆内存使用趋势
- 如果内存持续增长不回落,可能存在内存泄漏
- 关注 Old Gen 区的使用情况
-
线程:监控线程状态
- 使用"检测死锁"按钮可以自动发现死锁
- 关注 BLOCKED 状态的线程数量
-
类:跟踪类加载情况
- 突然的类加载数激增可能预示问题
避坑指南:
- 生产环境慎用 jconsole,它的开销较大可能影响性能
- 对于高负载系统,建议使用轻量级的命令行工具
- 远程连接时要确保网络稳定,否则可能断开
5. 性能分析工具:jvisualvm 深度解析
5.1 基础功能
jvisualvm 是比 jconsole 更强大的分析工具,启动方式类似:
bash复制jvisualvm
它除了提供基本的监控功能外,还支持:
- 内存快照分析
- 线程快照分析
- CPU 性能分析
- 插件扩展
5.2 内存泄漏分析实战
当怀疑有内存泄漏时,可以按以下步骤操作:
- 在 jvisualvm 中选择目标进程
- 点击"堆 Dump"按钮生成内存快照
- 分析快照中的大对象
- 按类或包名分组查看
- 关注异常多的对象实例
典型案例:
- 静态集合持续增长
- 缓存未设置上限
- 数据库连接未关闭
5.3 线程分析技巧
线程问题也是常见故障源,jvisualvm 可以:
- 查看所有线程的堆栈跟踪
- 检测死锁
- 监控线程状态变化
实用技巧:
- 定期保存线程快照,便于对比分析
- 关注长时间处于 RUNNABLE 状态的线程
- 结合 CPU 使用率分析热点线程
6. 命令行监控三剑客:jstat、jstack、jmap
6.1 jstat:GC 监控专家
jstat 是监控 GC 活动的利器,基本语法:
bash复制jstat -gcutil <pid> <interval> <count>
示例输出:
code复制S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0.00 0.00 75.00 45.00 95.00 90.00 15 0.750 3 1.500 2.250
关键指标解读:
- YGC/YGCT:Young GC 次数和总耗时
- FGC/FGCT:Full GC 次数和总耗时
- O:老年代使用百分比(超过80%需警惕)
6.2 jstack:线程快照分析
当应用无响应或 CPU 飙高时,jstack 是首选工具:
bash复制jstack <pid> > thread_dump.txt
分析技巧:
- 搜索 "deadlock" 找死锁
- 统计线程状态分布
- 查找长时间运行的线程
常见问题模式:
- 大量线程 BLOCKED:锁竞争激烈
- 重复的堆栈跟踪:可能陷入死循环
- 等待 I/O:检查外部依赖响应
6.3 jmap:内存快照生成
jmap 用于生成堆内存快照:
bash复制jmap -dump:format=b,file=heap.hprof <pid>
使用注意事项:
- 生成快照会暂停应用,生产环境慎用
- 快照文件可能很大,确保磁盘空间充足
- 结合 jvisualvm 或 MAT 分析效果更佳
7. 综合问题排查流程
根据多年经验,我总结了一套标准排查流程:
-
初步定位:
jps确认进程存在top/htop查看系统资源使用
-
内存问题:
jstat观察 GC 活动jmap生成堆转储- 分析内存快照
-
CPU 问题:
jstack抓取线程快照- 分析热点线程
-
死锁/阻塞:
jstack检测死锁jconsole可视化监控
黄金法则:
- 一次只改变一个变量
- 保留完整的操作记录
- 在测试环境复现问题
8. 高级技巧与注意事项
8.1 自动化监控脚本
将常用命令封装成脚本可以大大提高效率:
bash复制#!/bin/bash
PID=$(jps | grep MyApp | awk '{print $1}')
jstat -gcutil $PID 1000 10
jstack $PID > thread_$(date +%s).txt
8.2 安全注意事项
- 生产环境谨慎使用
jmap和jstack,可能影响服务 - 远程监控要确保通道安全
- 敏感信息可能出现在堆转储中,妥善保管
8.3 性能调优经验
- 频繁 Full GC:增大堆内存或调整 GC 策略
- 线程竞争激烈:优化锁粒度
- 类加载过多:检查依赖冲突
最后记住,工具只是手段,关键是要培养系统性思维。每次故障都是一次学习机会,积累的经验才是最宝贵的财富。