Java命令列監控工具(jmap,jstack,jstat,jinfo
專案部署上線之後,線上專案是不能輕易修改的,定位問題的難度也會變大。因此監控是非常重要的一個環節,有了監控,我們才能更好的定位系統中的問題,從而排查。監控的工具有很多種, 但是java自帶的命令列監控工具,是必須要掌握的。
jps
檢視系統中jvm程式, 其它的命令通常先使用jps檢視程式號,然後在根據執行緒號獲取jvm程式資訊
jps -m 檢視jvm程式並且帶有引數檢視
jps -v 檢視傳遞到jvm的引數
官方jps解釋:
jstat
顯示JVM的效能統計資訊,
常見用法:jstat -
解釋下-gc選項中列的含義:-gc檢視垃圾收集器中的資訊, 主要包含jvm的執行時資料區統計。
字尾為C的代表當前區的容量,字尾為U的代表已經使用了多少容量,字尾為T的代表耗時
S0C 存活區0的容量(KB)
S1C 存活區1的容量(KB)
S0U 存活區0使用的空間 (KB).
S1U 存活區1的利用空間 (KB).
EC Eden區的容量(KB).
EU Eden區利用的容量(KB).
OC 老年代容量(KB).
OU 老年代使用容量(KB).
PC 當前永久帶的容量(KB).
PU 永久帶使用容量(KB).
YGC 發生了多少次Young GC
YGCT Young GC的時間
FGC Full GC的次數
FGCT Full GC的收集時間
GCT 總共的GC時間.
官方jstat解釋:
jstack
檢視執行緒堆疊資訊,在發生死鎖的時候可以利用這個命令查詢死鎖或者在發生死迴圈的時候利用此命令排查。
jstack vmpid 會列印執行緒的堆疊資訊。透過堆疊可以檢視具體執行緒正在執行那些程式碼,廈門演示兩個使用jstack排查死鎖與死迴圈的命令。
死鎖程式碼:
public class DeadLock {
private static Object o1 = new Object();
private static Object o2 = new Object();
private static CountDownLatch countDownLatch = new CountDownLatch(2);
public static void main(String[] args) throws InterruptedException {
new Thread(){
@Override
public void run() {
synchronized (o1){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("執行緒1 獲得鎖1");
synchronized (o2){
System.out.println("執行緒1 獲得鎖2");
countDownLatch.countDown();
}
}
}
}.start();
new Thread(){
@Override
public void run() {
synchronized (o2){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("執行緒2 獲得鎖2");
synchronized (o1){
System.out.println("執行緒2 獲得鎖1");
countDownLatch.countDown();
}
}
}
}.start();
countDownLatch.await();
System.out.println("執行完畢");
}
}
死鎖之後:
可以看到jstack已經幫我們找到了死鎖。
死迴圈需要配合Top命令一起使用,死迴圈會導致CPU不斷的飆升,這時候使用top命令,檢視cpu佔用率較高的命令:
使用top -H -p 24278 檢視程式中具體是那一條執行緒的CPU利用率高
可以看到是24279的執行緒,在top中使用的是10進位制,在jstack中列印的執行緒是16進位制,因此做一次轉換。
24279 => 5ed7
然後檢視執行緒:
然後我們可以知道具體那一行的指令在一直執行。
jinfo檢視JVM啟動時候設定的引數值
jinfo可以檢視當前JVM執行緒配置的系統屬性,以及執行時設定的引數值。
直接使用jinfo
-
前半段是系統的屬性
- 後半段是jvm的引數
我們也可以直接使用jinfo檢視具體的某個引數值:
jmap分析堆
在發生OME的時候,會用jmap分析堆中具體是什麼問題,才能更好的解決問題。jmap一般和mat配合使用。
一般在java開發的專案啟動時候,最好加上下面命令,在記憶體溢位的時候可以透過日誌檢視資訊。
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/java/dump
當然在專案執行的時候也可以使用jmap -heap jvmpid檢視物件記憶體的對映。
演示記憶體溢位
堆記憶體溢位程式碼
public class DealCycle {
public static LinkedList linkedList = new LinkedList();
public static void main(String[] args) {
int i = 0;
while (true){
linkedList.add(i);
}
}
}
執行:
大家可以去網站上下載java mat的二進位制壓縮包,學習一下
線上分析hprof檔案:
如果每次都等到記憶體溢位才匯出檔案時間就有些晚了,可以使用jmap直接匯出
最後
這篇文章主要介紹了java自帶的命令列工具,透過這些命令列工具,我們可以很好的得知當前jvm的執行狀態。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2983/viewspace-2804399/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Java命令列監控工具(jmap,jstack,jstat,jinfo,jps)Java命令列JS
- Java——命令jps、jstat、jmap、jstack、jhat、jinfoJavaJS
- java虛擬機器記憶體監控工具jps,jinfo,Jstack,jstat,jmap,jhat使用Java虛擬機記憶體JS
- JVM監控工具:jps、jstat、jinfo、jmap、jhat、jJVMJS
- jvm系列(四):jvm調優-命令大全(jps jstat jmap jhat jstack jinfo)JVMJS
- jstack, jstat, jmap, jinfo, 教你如何在背後偷窺你的程式^^JS
- JDK幾個很實用的工具 jps、jinfo、jstat、jstack、jmap、jconsoleJDKJS
- JVM效能調優監控工具——jps、jstack、jmap、jhat、jstat、hprof使用詳解JVMJS
- (轉)JVM調優常用命令(jstat、jmap、jstack)JVMJS
- 使用JDK工具jmap和jhat監控Java程式JDKJava
- JMap與JStackJS
- jstack和jmap1JS
- MyCAT的命令列監控工具介紹命令列
- java命令--jmap命令使用Java
- Java生產環境效能監控與調優—基於JDK命令列工具的監控JavaJDK命令列
- ☕[JVM效能專題](1)效能監控-命令列工具JVM命令列
- 監控 Linux 效能的 18 個命令列工具Linux命令列
- 監控Linux效能的18個命令列工具Linux命令列
- 【JVM進階之路】八:效能監控工具-命令列篇JVM命令列
- 監控 Linux 系統的 7 個命令列工具Linux命令列
- Java的jinfo命令使用詳解Java
- [轉載]監控 Linux 效能的 18 個命令列工具Linux命令列
- Java的jmap命令使用詳解Java
- [轉載]JDK自帶VM分析工具jps,jstat,jmap,jconsoleJDKJS
- Java的jstat命令使用詳解JavaJS
- jstat命令JS
- Java的jstack命令使用詳解JavaJS
- 監控 Linux 容器效能的命令列神器Linux命令列
- Java效能監控工具:VisualVMJavaLVM
- ngxtop:在命令列實時監控 Nginx 的神器命令列Nginx
- 使用JDK自帶的jmap和jhat監控處於執行狀態的Java程式JDKJava
- 【Nginx】ngxtop:在命令列實時監控 Nginx 的神器Nginx命令列
- MySQL監控工具MySql
- Redis監控工具Redis
- Ganglia監控工具
- mongodb 監控分析命令MongoDB
- 又一波你可能不知道的 Linux 命令列網路監控工具Linux命令列
- Mycat Web監控工具Web