摘抄至《深入理解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>