jdk 自带命令可快速定位 java 应用卡顿根源:jps 查进程、jstack 分析线程阻塞与死锁、jmap 监控内存与生成 dump、jinfo 查看或临时修改 jvm 参数、jstat 实时追踪 gc 与内存变化。

想快速定位线上 Java 应用卡顿的根源,却连进程 ID 都找不到;想确认某个服务是否真在跑,又不敢随便 kill;内存暴涨时不知道该抓哪类快照——这些日常排查场景,全靠 JDK 自带命令解决,不用装任何第三方工具。
查进程:jps 快速列出所有 Java 进程
第一步:打开终端(Windows 用 CMD 或 PowerShell,macOS/Linux 用 Terminal)。
输入 jps 回车,直接输出当前用户下所有 Java 进程的 PID 和主类名,例如:
12345 ApplicationStarter
67890 Jps
如果只想要纯数字 PID(比如配合脚本自动处理),加 -q 参数:jps -q → 输出就是两行数字,没有多余字符。
【注意:jps 默认不显示系统级 Java 进程,如被 root 启动的服务,普通用户执行看不到】
看线程:jstack 抓取线程快照分析阻塞与死锁
方法一:导出完整线程堆栈到文件
执行 jstack -l 12345 > thread_12345.log,其中 12345 是目标进程 PID。这会把锁信息、线程状态、调用栈全写进日志。
方法二:直接在终端查看(适合快速瞄一眼)jstack -l 12345 → 终端滚动输出,搜索关键词 deadlock 或 WAITING 就能发现异常线程。
线上 CPU 飙高时,先用 top -Hp 12345 找出占用最高的线程 tid(十进制),再转成十六进制,回到 jstack 日志里搜这个 hex 值,就能精确定位是哪个方法在狂占 CPU。
盯内存:jmap 查堆概况、统计对象、生成 dump
① 看堆配置和使用率:jmap -heap 12345 → 显示新生代/老年代大小、GC 算法、已用/总空间,一眼判断是否内存不足或配置不合理。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
② 按类统计存活对象数量和内存占比:jmap -histo :live 12345 | head -20 → 筛出前 20 行,重点关注 java.lang.String、byte[]、自定义大对象是否异常堆积。
③ 生成可用于离线分析的堆转储文件:jmap -dump:format=b,file=heap_12345.hprof 12345 → 文件体积通常几百 MB 起,确保目标路径有足够磁盘空间,且进程仍有响应能力(避免在已 OOM 的进程上强行 dump)。
查 JVM 参数:jinfo 动态读取或修改运行时配置
查看所有 JVM 启动参数:jinfo -flags 12345 → 输出类似 -XX:+UseG1GC -Xmx4g 这类真实生效的参数,比翻启动脚本更可靠。
临时开启 GC 日志(无需重启):jinfo -flag +PrintGCDetails 12345 → 立即生效,日志会输出到应用 stdout/stderr,适合临时诊断 GC 频繁问题。
【警告:jinfo 修改部分参数(如堆大小)可能触发 Full GC 或失败,生产环境慎用 -flag 修改】
监控指标:jstat 实时追踪 GC 和内存变化
每 2 秒刷新一次年轻代 GC 统计,持续 5 次:jstat -gc 12345 2000 5 → 输出列包括 S0U(Survivor0 使用量)、EU(Eden 使用量)、OU(老年代使用量)、YGCT(Young GC 次数)、FGCT(Full GC 次数)。
如果 OU 持续上涨、FGCT 频繁增加,基本可判定存在内存泄漏;若 EU 飙升后骤降、YGCT 密集,说明对象生命周期短、分配压力大。
想看类加载情况?换参数:jstat -class 12345 1000 → 观察 Loaded(已加载类数)是否持续增长,辅助判断是否存在动态类加载泄漏。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










