虛擬機性能監控之JDK命令行工具

摘抄至《深入理解JAVA虛擬機》第2版,記錄在此,方便查閱。

JDK的命令行工具

名稱 主要作用
jps JVM Process Status Tool,顯示指定系統內所有的HotSpot虛擬機進程
jstat JVM Statistics Monitoring Tool,用於收集HotSpot虛擬機各方面的運行數據
jinfo Configuration Info for Java,顯示虛擬機配置信息
jmap Memory Map for Java,生成虛擬機的內存轉儲快照(heapdump文件)
jhat JVM Heap Dump Browser,用於分析heapdump文件,它會建立一個HTTP/HTML服務器,讓用戶可以在瀏覽器上查看分析結果。
jstack Stack Trace for Java,顯示虛擬機的線程快照。

1.jPS:虛擬機進程狀況工具

jps命令格式:

jps [ options ] [hostid]

主要選項:

-q:只輸出LVMID,省略主類的名稱;
-m:輸出虛擬機進程啓動時傳遞給主類Main()函數的參數;
-l:輸出主類的命名,如果進程執行的是jar包,輸出jar路徑;
-v:輸出虛擬機進程啓動時JVM參數

jps執行樣例:

這裏寫圖片描述

2.jstat:虛擬機統計信息監視工具

jstat命令格式:

jstat [ option vmid [interval[s|ms] [count]] ]

對於命令格式中的VMID與LVMID需要特別說明一下:如果是本地虛擬機進程,VMID與LVMID是一致的,如果是遠程虛擬機進程,那VMID的格式應當是:

[protocol:] [//]lvmid[@hostname[:port]/servername]

參數interval和count代表查詢間隔和次數,如果省略這兩個參數,說明只查詢一次。假設需要每250秒查詢一次進程2764垃圾收集情況,一共查詢20次,那命令應該是:

jstat -gc 2764 250 20

jstat工具主要選項:

-class:監視類裝載、卸載數量、總空間以及類裝載所耗時間。

-gc:監視JAVA堆狀況,包括Eden區、兩個Survivor區、老年代、永久代等的容量、已用空間,GC已用時間合計等信息;

-gccapacity:監視內容與-gc基本相同,但輸出主要關注 java堆各個區域使用到的最大、最小空間;

-gcutil:監視內容與-gc基本相同,便輸出主要關注已使用空間佔總空間的百分比;

-gccause:與-gcutil功能一樣,但是會額外輸出導致 一次GC產生的原因;

-gcnew:監視新生代GC狀態;

-gcnewcapacity:監視內容與-gcnew基本相同,輸出最要關注使用到的最大、最小空間;

-gcold:監視老年代GC狀況;

-gcoldcapacity:監視內容與-gcold基本相同,輸出主要關注使用到的最大、最小空間;

-gcpermcapacity:監視永久代使用到的最大、最小空間;

-compiler:輸入JIT編譯器編譯過的方法,耗時等信息;

-printcompilation:輸出已經被JIT編譯的方法;

jstat執行樣例:查看idea運行時內存區域及GC時間情況,9160是通過jps命令查詢得到的

這裏寫圖片描述

3.jinfo:java配置信息工具

jinfo的作用是實時查看和調整虛擬機各項參數。

jinfo命令格式:

jinfo [ option ] pid ###pid指的進程號

jinfo的主要選項:

-flag <name> :可查看虛擬機啓動時顯式指定的參數列表。
-flag [+|-]<name>:設置或取消VM參數
-flag <name>=<value>:給VM參數設置新值
-flags:可查看所有VM參數;
-sysprops:查看java系統參數;
<no option>:表示在不給定任何選項時,打印出以上所有的VM參數

jinfo樣例:不給任務參數選項時執行情況

這裏寫圖片描述

顯示內容較多,只帖了部分。示例中pid:6728是在window下任務管理器中獲得到idea進程號。

**4.jmap:java內存映像工具

jmap命令用於生成堆轉儲快照——heapdump或dump文件。另外它還可以查詢finalize執行隊列、java堆和永久代的詳細信息,如空間使用率、當前用的是哪種收集器等。jmap與jinfo一樣在windows平臺下不少功能受限。

jmap 命令格式:

jmap [ option ] vmid

jmap option選項

-dump:生成java堆轉儲快照,格式爲:-dump[live, ] format=b, file=<filename>,其中live子參數說明是否只dump出存活對象;

-finalizerinfo:顯示在F-QueuiK 等待Finalizer線程執行finalize方法的對象。只在Linux/Solaris平臺下有效;

-heap:顯示java堆詳細信息,如使用哪種回收器、參數配置、分代狀況等。只在Linux/Solaris平臺下有效;

-histo:顯示堆中對象統計信息,包括類、實例數量、合計容量;

-permstat:以ClassLoader爲統計口徑顯示永久代內存狀態,只在Linux/Solaris平臺有效;

-F:當虛擬機進程對-dump選項沒有響應時,可使用這個選項強制生成dump快照,只在Linux/Solaris平臺有效

示例:jmap生成堆轉存快照,這裏表示已經存在了,查了相應目錄,確實已經存在了。

這裏寫圖片描述

5.jhat:虛擬機堆轉存快照分析工具

jhat命令與jmap搭配使用,來分析jmap生成的堆轉儲快照。jhat內置了一個微型的http/html服務器,生成dump文件的分析結果後,可以在瀏覽器中查看。但通常實際工作中會使用其他工具代替,如visualVm。

jhat命令格式:

jhat idea.bin

jhat示例:解析完後會啓動一個http服務,用瀏覽器訪問即可。

這裏寫圖片描述

6.jstack:Java堆棧跟蹤工具

jstack命令用於生成虛擬機當前時刻的線程快照——threaddump或javacore文件。線程快照就是當前虛擬機內第一條線程正在執行的方法堆棧集合,生成線程快照的主要目的是定位線程出現長時間停頓的原因,如線程間死鎖。

jstack命令格式:

jstack [ option ] vmid

jstack option的具體含義:

-F :當正常輸出的請求不被響應時,強制輸出線程堆棧;
-I:除堆棧外,顯示 關於鎖的附加信息;
-m:如果調用到本地方法的話,可以顯示C/C++的堆棧;

在jdk1.5中,java.lang.Thread類新增了一個getAllStackTraces()方法用於獲取虛擬機中所有線程的StackTraceElement對象,使用這個方法可以通過 幾行代碼就完成jstack的大部分功能。

查看線程狀況的JSP頁面:

<@ page import="java.util.Map"%>
<html>
<head>
<title>服務器線程詐</title>
</head>
<body>
<pre>
<%
    for(Map.Entry<Thread,StackTraceElement[]> stackTrace :Thread.getAllStackTraces().entrySet()){
        Thread thread = (Thread) stackTrace.getKey();
        StackTraceElement[] stack = (StackTraceElement[]) stackTrace.getValue();
        if(thread.equals(Thread.currentThread())){
            continue;
        }
        out.print("\n線程:" + thread.getName() + "\n");
        for(StackTraceElement element :stack) {
            out.print("\t”+ element + "\n");
        }
}
%>
</pre>
</body>
</html>


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章