JDK命令行工具
這些命令在JDK安裝目錄的bin目錄下:
- jsp:類似UNIX的ps命令族展,用于查看所有java進(jìn)程的啟動(dòng)類缚陷。傳入?yún)?shù)和java虛擬機(jī)參數(shù)等信息达吞。
- jstat:用于收集HotSpot虛擬機(jī)各方面的運(yùn)行數(shù)據(jù)培他。
- jinfo:Configuration Info for Java,顯示虛擬機(jī)配置信息粉臊。
- jmap:生成堆轉(zhuǎn)儲(chǔ)快照草添。
- jhat:用于分析heapdump文件,它會(huì)建立一個(gè)HTTP/HTML服務(wù)器扼仲,讓用戶可以在瀏覽器上查看分析結(jié)果远寸。
- jstack:生成虛擬機(jī)當(dāng)前時(shí)刻的線程快照,線程快照就是當(dāng)前虛擬機(jī)內(nèi)每一條線程正在執(zhí)行的方法堆棧的集合屠凶。
jps:查看所有java進(jìn)程
jps(JVM Process Status)命令類似UNIX的ps命令驰后、
jps:顯示虛擬機(jī)執(zhí)行主類名稱以及這些進(jìn)程的本地虛擬機(jī)唯一ID。
jps -q:只輸出進(jìn)程的本地虛擬機(jī)唯一ID.
jps -l:輸出主類的全名阅畴,如果進(jìn)程執(zhí)行的是jar包倡怎,輸出jar路徑。
jps -v:輸出虛擬機(jī)進(jìn)程啟動(dòng)時(shí)JVM參數(shù)贱枣。
jps -m:輸出傳遞給java進(jìn)程main()函數(shù)的參數(shù)
jstat:監(jiān)視虛擬機(jī)各種運(yùn)行狀態(tài)信息
jstat是用于監(jiān)視虛擬機(jī)各種運(yùn)行狀態(tài)信息的命令行工具监署。它可以顯示本地或者遠(yuǎn)程(需要遠(yuǎn)程主機(jī)提供RMI支持)虛擬機(jī)進(jìn)程中的類信息,內(nèi)存纽哥,垃圾收集钠乏,JIT編譯等運(yùn)行數(shù)據(jù)。在沒(méi)有GUI春塌,只提供了純文本控制臺(tái)環(huán)境的服務(wù)器上晓避,它將是運(yùn)行期間定位虛擬機(jī)性能問(wèn)題的首選工具。
jstat命令使用格式:
jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
比如如下命令:jstat -gc -h3 17188 1000 10
表示分析進(jìn)程id為 17188的gc情況只壳,每1000ms打印一次記錄俏拱,打印10次停止。每三行打印指標(biāo)頭部吼句。
效果如下:
當(dāng)然了實(shí)例中的-gc也可以換成別的锅必,常見(jiàn)的option如下:
- jstat -class vmid:顯示ClassLoader的相關(guān)信息
- jstat -compiler vmid:顯示JIT編譯相關(guān)的信息
- jstat -gc vmid:顯示與GC相關(guān)的堆信息
- jstat -gccapacity vmid:顯示各個(gè)代的容量以及使用信息
- jstat -gcnew vmid:顯示新生代信息
- jstat -gcnewcapacity vmid:顯示新生代大小和使用情況
- jstat -gcold vmid:顯示老年代和永久代行為統(tǒng)計(jì)。不過(guò)1.8開始因?yàn)橛谰么灰瞥颂柩蓿灾伙@示老年代的行為統(tǒng)計(jì)了搞隐。
- jstat -gcoldcapacity vmid:顯示老年代大小
- jstat -gcpermcapacity vmid:顯示永久代大小。jdk1.8被移除了远搪。
-
jstat -gcutil vmid:顯示垃圾收集信息
上述命令加上-t 參數(shù)可以在輸出信息上看到Timestamp列劣纲,顯示程序運(yùn)行時(shí)間。
jinfo:實(shí)時(shí)查看和調(diào)整虛擬機(jī)各項(xiàng)參數(shù)
jinfo vmid : 輸出當(dāng)前jvm進(jìn)程的全部參數(shù)和系統(tǒng)屬性(第一部分是系統(tǒng)的屬性谁鳍,第二把部分是jvm的參數(shù))癞季。
jinfo -flag name vmid:輸出對(duì)應(yīng)名稱的參數(shù)的具體值劫瞳。比如輸出MaxHeapSize,查看這個(gè)當(dāng)前jvm進(jìn)程是否開始打印GC日志等。
使用jinfo可以在不重啟虛擬機(jī)的情況下绷柒,動(dòng)態(tài)修改jvm參數(shù)柠新。尤其是線上的環(huán)境特別有用。
使用jinfo -flag +/- name vmid 可以開啟或者關(guān)閉對(duì)應(yīng)名稱的參數(shù)辉巡。之前我們看到是開啟了gc打印的,現(xiàn)在關(guān)閉一下:
jmap:生成堆轉(zhuǎn)儲(chǔ)快照
jmap命令用于生成堆轉(zhuǎn)儲(chǔ)快照蕊退。如果不使用jmap命令郊楣,想要獲取java堆轉(zhuǎn)儲(chǔ),可以使用“-XX:+HeapDumpOnOutOfMemoryError” 參數(shù)瓤荔【辉椋可以讓虛擬機(jī)在OOM異常出現(xiàn)之后自動(dòng)生成dump文件,linux命令下可以通過(guò)kill -3發(fā)送進(jìn)程退出信號(hào)也能拿到dump文件输硝。
jmap的作用不僅僅是為了獲取dump文件今瀑,他還可以查詢finalizer執(zhí)行隊(duì)列,java堆和永久代的詳細(xì)信息点把,如空間使用率橘荠,當(dāng)前使用的是哪種收集器等。和jinfo一樣郎逃,jmap有不少功能在windows平臺(tái)下也是受限制的哥童。
jhat:分析heapdump文件
jhat用于分析heapdump文件,它會(huì)建立一個(gè)HTTP/HTML服務(wù)器褒翰,讓用戶可以在瀏覽器上查看分析結(jié)果贮懈。
jstack:生成虛擬機(jī)當(dāng)前時(shí)刻的線程快照
jstack命令用于生成虛擬機(jī)當(dāng)前時(shí)刻的線程快照,線程快照就是當(dāng)前虛擬機(jī)每一條線程正在執(zhí)行的方法堆棧的集合优训。
生成線程快照的目的主要是定位線程長(zhǎng)時(shí)間出現(xiàn)停頓的原因朵你,如線程間死鎖,死循環(huán)揣非,請(qǐng)求外部資源導(dǎo)致的長(zhǎng)時(shí)間等待等抡医。都是導(dǎo)致線程長(zhǎng)時(shí)間停頓的原因。線程出現(xiàn)停頓的時(shí)候通過(guò)jstack來(lái)查看各個(gè)線程的調(diào)用堆棧妆兑。就可以知道沒(méi)有響應(yīng)的線程到底在后臺(tái)做了些什么事魂拦,或者在等待什么資源。
下面是死鎖的demo:
public class Test {
private static Object resource1 = new Object();//資源 1
private static Object resource2 = new Object();//資源 2
public static void main(String[] args){
new Thread(() -> {
synchronized (resource1) {
System.out.println(Thread.currentThread() + "get resource1");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread() + "waiting get resource2");
synchronized (resource2) {
System.out.println(Thread.currentThread() + "get resource2");
}
}
}, "線程 1").start();
new Thread(() -> {
synchronized (resource2) {
System.out.println(Thread.currentThread() + "get resource2");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread() + "waiting get resource1");
synchronized (resource1) {
System.out.println(Thread.currentThread() + "get resource1");
}
}
}, "線程 2").start();
}
}
我們啟動(dòng)這個(gè)main方法后去控制臺(tái)查看(先用jps查看了死鎖的這個(gè)線程是18532):
因?yàn)檫@個(gè)結(jié)果比較長(zhǎng)搁嗓,所以截圖截了最關(guān)鍵的部分芯勘。可以看到j(luò)stack已經(jīng)幫我們定位到了死鎖腺逛。
JDK可視化分析工具
JConsole:java監(jiān)視與管理控制臺(tái)
JConsole是基于jmx的可視化監(jiān)視荷愕,管理工具。可以很方便的監(jiān)視本地以及遠(yuǎn)程服務(wù)器的java進(jìn)程的內(nèi)存使用情況安疗。你可以在控制臺(tái)輸出console命令啟動(dòng)或者在JDK目錄的bin目錄找到j(luò)console.exe雙擊啟動(dòng)抛杨。
選擇一個(gè)線程鏈接后就可以看到可視化頁(yè)面:
內(nèi)存監(jiān)控
JConsole可以顯示當(dāng)前內(nèi)存的詳細(xì)信息。不僅包括堆內(nèi)存/非堆內(nèi)存的整體信息荐类。還可以細(xì)化到Eden區(qū),Survivor區(qū)等的使用情況怖现,如下圖所示:
點(diǎn)擊右邊的執(zhí)行GC 按鈕可以強(qiáng)制應(yīng)用程序執(zhí)行一個(gè)full GC。
線程監(jiān)控
類似我們前面講的jstack命令玉罐,不過(guò)這個(gè)是可視化的屈嗤。
最下面有一個(gè)檢測(cè)死鎖的按鈕,點(diǎn)擊這個(gè)按鈕可以自動(dòng)為你找到發(fā)生死鎖的線程和詳細(xì)信息吊输。
Visual VM:多合一故障處理工具
VisualVM 提供在java虛擬機(jī)上運(yùn)行的java應(yīng)用程序的詳細(xì)信息饶号。在VisualVM的圖形用戶界面中,可以方便季蚂,快捷的查看多個(gè)java應(yīng)用程序的相關(guān)信息茫船。
Visual VM 官網(wǎng):https://visualvm.github.io/ 。Visual VM 中文文檔:https://visualvm.github.io/documentation.html扭屁。
VisualVM是到目前為止隨著JDK發(fā)布的功能最強(qiáng)大的運(yùn)行監(jiān)視和故障處理程序算谈。官方在VisualVM的軟件說(shuō)明上寫了all in one的描述。預(yù)示著他除了運(yùn)行監(jiān)視料滥,故障處理外濒生,還提供了很多其他方面的功能,如性能分析幔欧。VisualVM的性能分析功能甚至比起JProfiler罪治,YourKit等專業(yè)且收費(fèi)的工具都不會(huì)遜色。而且VisualVM還有一個(gè)很大的優(yōu)點(diǎn):不需要被監(jiān)視的程序特殊 運(yùn)行礁蔗,因此他對(duì)于應(yīng)用程序的實(shí)際性能的影響很小觉义。使得他可以直接應(yīng)用在生產(chǎn)環(huán)境中。這個(gè)優(yōu)點(diǎn)是JProfiler浴井,YourKit等工具無(wú)法媲美的晒骇。
VisualVM基于NetBeans平臺(tái)開發(fā),因此一開始就具備了插件擴(kuò)展功能的特性磺浙。通過(guò)插件擴(kuò)展支持洪囤,VisualVM可以做到:
- 顯示虛擬機(jī)進(jìn)程以及進(jìn)程的配置,環(huán)境信息(jps,jinfo)
- 監(jiān)視應(yīng)用程序的CPU,GC,堆撕氧,方法區(qū)以及線程的信息(jstat,jstack)
- dump以及分析堆轉(zhuǎn)儲(chǔ)快照(jmap,jhat)
- 方法級(jí)的程序運(yùn)行性能分析瘤缩,找到被調(diào)用最多,運(yùn)行時(shí)間最長(zhǎng)的方法伦泥。
- 離線程序快照:收集程序的運(yùn)行時(shí)配置剥啤,線程dump锦溪,內(nèi)存dump等信息建立一個(gè)快照,可以將快照發(fā)送開發(fā)者處進(jìn)行bug反饋府怯。
- 其他plugins的無(wú)限的可能性
這里就不介紹VisualVM了刻诊,想了解的自己去看官網(wǎng)。
本篇筆記就記到這里牺丙,如果稍微幫到你了記得點(diǎn)個(gè)喜歡點(diǎn)個(gè)關(guān)注则涯,也祝大家工作順順利利,每天都有所進(jìn)步冲簿!