JDK自帶的四大命令行工具(jstat/jstack/jmap/jhat)的使用詳解
這四個(gè)是 JDK 自帶的線上問題排查核心工具,專門用于定位 Java 應(yīng)用的性能瓶頸、內(nèi)存泄漏、死鎖、CPU 飆高等問題,無需額外安裝,只要裝了 JDK 就能用。
我會用最實(shí)用、最常用的命令,直接告訴你:什么時(shí)候用、怎么用、看什么。
一、先準(zhǔn)備:獲取 Java 進(jìn)程 ID
所有工具第一步都需要進(jìn)程 ID(PID),先執(zhí)行:
jps -l
輸出示例:
12345 com.example.Application
67890 sun.tools.jps.Jps
12345 就是你的 Java 應(yīng)用 PID。
1. jstat:JVM 統(tǒng)計(jì)信息監(jiān)控工具(看性能、GC)
作用:查看類加載、內(nèi)存使用、GC 頻率/耗時(shí),排查 GC 頻繁、內(nèi)存占用高問題。
最常用命令
1)查看 GC 概況(最常用)
jstat -gc 12345 1000 10
1000:每隔 1000ms(1秒)輸出一次10:總共輸出 10 次
關(guān)鍵字段:
S0C/S1C:Survivor 區(qū)大小E:Eden 區(qū)使用比例O:老年代使用比例YGC/YGT:Young GC 次數(shù)/耗時(shí)FGC/FGT:Full GC 次數(shù)/耗時(shí)GCT:GC 總耗時(shí)
排查技巧:
- FGC 快速上漲 ? 老年代內(nèi)存泄漏
- YGC 每秒多次 ? 短生命周期對象過多
2)查看堆內(nèi)存使用百分比
jstat -gcutil 12345
2. jstack:堆棧跟蹤工具(看線程、死鎖、CPU 飆高)
作用:導(dǎo)出線程堆棧,排查死鎖、線程阻塞、CPU 100%、程序假死。
最常用命令
1)導(dǎo)出所有線程堆棧(保存到文件分析)
jstack 12345 > thread.log
2)直接排查死鎖(自動檢測)
jstack -l 12345
文件末尾會顯示:Found one Java-level deadlock
排查 CPU 飆高高階用法
找到 CPU 最高的線程 ID
top -H -p 12345
將線程 ID 轉(zhuǎn)成 16 進(jìn)制
printf "%x\n" 12345
在 jstack 日志中搜索該 16 進(jìn)制 ID,定位耗時(shí)代碼
3. jmap:內(nèi)存映像工具(導(dǎo)出堆、看對象)
作用:導(dǎo)出堆內(nèi)存快照(dump 文件),查看堆內(nèi)對象數(shù)量、大小,定位內(nèi)存泄漏。
最常用命令
1)導(dǎo)出堆快照(排查內(nèi)存泄漏必備)
jmap -dump:format=b,file=heap.hprof 12345
heap.hprof:二進(jìn)制堆文件,可導(dǎo)入工具分析- 注意:導(dǎo)出時(shí)會暫停 JVM,生產(chǎn)環(huán)境謹(jǐn)慎使用
2)查看堆中對象統(tǒng)計(jì)(數(shù)量+大?。?/p>
jmap -histo 12345 | head -20
輸出:序號、實(shí)例數(shù)、字節(jié)數(shù)、類名
能直接看到哪個(gè)類的對象最多,快速定位泄漏點(diǎn)。
3)查看 JVM 堆配置
jmap -heap 12345
查看新生代、老年代大小、垃圾回收器等信息。
4. jhat:堆快照分析工具(分析 hprof 文件)
作用:解析 jmap 導(dǎo)出的 hprof 堆快照,提供 Web 界面查看內(nèi)存對象。
注意:jhat 功能簡單,大型堆文件建議用 MAT(Eclipse Memory Analyzer),jhat 適合快速簡單分析。
使用命令
jhat -port 9999 heap.hprof
- 啟動后訪問:
http://localhost:9999 - 頁面可查看:所有對象、引用關(guān)系、泄漏疑點(diǎn)
二、快速使用場景總結(jié)(直接背這個(gè))
| 工具 | 核心用途 | 最常用命令 |
|---|---|---|
| jstat | 看 GC、內(nèi)存使用率、性能監(jiān)控 | jstat -gc PID 1000 10 |
| jstack | 看線程、死鎖、CPU 飆高 | jstack -l PID > thread.log |
| jmap | 導(dǎo)出堆快照、看對象數(shù)量 | jmap -dump:file=heap.hprof PID |
| jhat | 分析堆快照(Web 界面) | jhat -port 9999 heap.hprof |
三、標(biāo)準(zhǔn)問題排查流程(實(shí)戰(zhàn))
- CPU 飆高:
top→jstack→ 定位耗時(shí)代碼 - 內(nèi)存飆升/泄漏:
jstat -gc看 FGC →jmap導(dǎo)出 dump →jhat/MAT分析 - 程序卡死:
jstack查死鎖、阻塞線程 - GC 頻繁:
jstat -gcutil定位 GC 問題
總結(jié)
- jstat:監(jiān)控 GC 和內(nèi)存使用,不暫停應(yīng)用
- jstack:抓線程堆棧,查死鎖、CPU 高
- jmap:導(dǎo)出堆快照,查對象泄漏
- jhat:簡單分析堆快照(推薦用 MAT 替代)
這四個(gè)工具是 Java 線上問題排查的基礎(chǔ)必備技能,記住常用命令就能解決 80% 的 JVM 問題。
到此這篇關(guān)于JDK自帶的四大命令行工具(jstat/jstack/jmap/jhat)的使用詳解的文章就介紹到這了,更多相關(guān)JDK命令行工具使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java反射中java.beans包學(xué)習(xí)總結(jié)
本篇文章通過學(xué)習(xí)Java反射中java.beans包,吧知識點(diǎn)做了總結(jié),并把相關(guān)內(nèi)容做了關(guān)聯(lián),對此有需要的朋友可以學(xué)習(xí)參考下。2018-02-02
SpringBoot結(jié)合prometheus自定義埋點(diǎn)方式
文章介紹了如何使用Spring Actuator、Prometheus和Grafana進(jìn)行度量統(tǒng)計(jì)收集、數(shù)據(jù)收集和數(shù)據(jù)展示,以監(jiān)控生成環(huán)境機(jī)器的性能指標(biāo)和業(yè)務(wù)數(shù)據(jù)指標(biāo)2024-12-12
shiro整合springmvc配置靜態(tài)資源過濾方式
文章介紹了在Spring Boot + Spring MVC + Shiro + JSP項(xiàng)目中,如何正確配置靜態(tài)資源路徑以避免在引入Shiro過濾器后資源加載失敗的問題2026-03-03
synchronized背后的monitor鎖實(shí)現(xiàn)詳解
這篇文章主要為大家介紹了synchronized背后的monitor鎖實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09
Java中的CopyOnWriteArrayList容器解析
這篇文章主要介紹了Java中的CopyOnWriteArrayList容器解析,CopyOnWriteArrayList容器允許并發(fā)讀,讀操作是無鎖的,性能較高。至于寫操作,比如向容器中添加一個(gè)元素,則首先將當(dāng)前容器復(fù)制一份,然后在新副本上執(zhí)行寫操作,需要的朋友可以參考下2023-12-12
Java遞歸調(diào)用如何實(shí)現(xiàn)數(shù)字的逆序輸出方式
這篇文章主要介紹了Java遞歸調(diào)用如何實(shí)現(xiàn)數(shù)字的逆序輸出方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04

