这是Java面试高频必考题 ,我给你用最清晰、最好记、面试直接说的方式讲清楚,不绕弯子。
jstack 和 jstat 核心区别(一句话总结)
jstack 看线程(栈)→ 查CPU高、死锁、代码卡在哪
jstat 看内存(GC)→ 查内存泄漏、GC频繁、堆使用
一个看线程 ,一个看垃圾回收,完全不是一个东西。
详细对比(面试照着说)
1. jstack
作用 :导出当前时刻所有线程的堆栈信息 。
用来解决什么问题:
- CPU 飙高
- 死锁
- 程序卡住、假死
- 线程阻塞、等待、死循环
看什么: - 每个线程当前执行到哪一行代码
- 线程状态(RUNNABLE/BLOCKED/WAITING)
- 锁竞争情况
典型命令
bash
jstack <pid>
2. jstat
作用 :实时查看JVM 内存使用 + GC 统计信息 。
用来解决什么问题:
- 频繁 GC / Full GC
- 内存占用高
- 内存泄漏
- 堆分配不合理
看什么: - YGC 次数、耗时
- FGC 次数、耗时
- 伊甸区、survivor、老年代使用率
典型命令
bash
jstat -gc <pid> 1000 // 每秒打印一次GC情况
最经典的面试题:CPU 高你用谁?内存高你用谁?
标准答案:
- CPU 高 → 用 jstack 定位线程和代码行
- 内存高 / GC 频繁 → 用 jstat 看 GC 情况
极简记忆口诀(超好背)
stack 看栈(线程)→ 找CPU、找死锁、找代码
stat 看状态(GC)→ 找内存、找垃圾回收
总结
- jstack = 线程快照 → 排查 CPU 高、死锁、代码卡住
- jstat = GC 统计 → 排查内存占用、频繁 GC