我們寫的java程序需要在jvm上運行,可能出現內存泄漏,死循環,內存溢出,死循環,死鎖,當發生這些事情的時候,我們就需要藉助jdk的工具。
jdk的bin目錄下有很多工具
例如
javac.exe 編輯java文件的
java.exe 來執行.class文件的
javap.exe 是反編譯.class文件的
jar.exe是用來打jar包的
將jdk的lib下的tools.jar 解壓,然後在sun/tools下可以看到與bin目錄下的工具名稱一樣的目錄,這裏面放的就是上面工具的源碼,編譯之後就可以運行了
我們jdk8學習這些命令
jps的作用
常見的命令參數有:
jps -v
jstat 命令
jstat -gc
如果不指定 間隔和次數,默認只會打印一次
jstat -class
jstat -compiler
gc命令的詳細分析
jstat -gc
01064341885 酒仙橋電話
S0C S1C 表示的是:堆內存中倖存區域的大小
S0U S1U 表示的是:堆內存中倖存區的使用大小
EC 表示的是:伊甸園區的內存大小
EU 表示的是:伊甸園區的使用內存
OC 表示的是:老年代的容量
OU 表示的是:老年代的使用狀態
(其中MC和MU 在jdk1.8中使用,即對於方法區的方案用的是:元空間,在jdk1.7中叫做永久代的大小)
MC 表示的是:元空間的大小
MU 表示的是:元空間的使用大小
CCSC 表示的是:類壓縮空間的容量
CCSU 表示的是:類壓縮空間使用的大小
YGC 表示的是: young gc的次數
YGCT 表示的是: young gc 用的時間
FGC:表示的是:Full gc 的次數
FGCT: 表示的是:Full gc 用的時間
GCT 表示的是: 所有gc用的時間
main方法中執行到數組第三次垃圾回收
jmp命令:
jmap -heap pid
分析:
jhat命令
點開:
jstack命令:
jstack -F pid
jstack -l
寫一個死循環代碼,我們藉助process explorer來查看cpu的使用情況
我們看到對應的Threads中6160(對應的十六進制是:1810) 的佔用cpu佔用的比較高:
我們根據進程id即java.exe 的進程id,利用 jstack -l 命令來查看該進程的所有線程信息,我們找到線程id是1810
下面是獲取外部資源(例如需要輸入,即卡頓長時間沒有響應)利用jstack來進行分析
利用jstack來演示死鎖:
可視化工具jconsole:
在terminal 中直接輸入jconsole 就可以看到圖形化界面了
虛擬機的配置信息