JDK的命令列工具

來源:互聯網
上載者:User

標籤:***   1.4   erp   執行   created   server   暴力   exp   tor   

 

jps:虛擬機器進程狀況工具

jps(JVM Process Status Tool)可以列出正在啟動並執行虛擬機器進程,並顯示虛擬機器執行主類(Main Class,main()函數所在的類)名稱以及這些進程的本地虛擬機器唯一ID(Local Virtual Machine Identifier,LVMID)。雖然功能比較單一,但它是使用頻率最高的JDK命令列工具,因為其他的JDK工具大多需要輸入它查詢到的LVMID來確定要監控的是哪一個虛擬機器進程。對於本地虛擬機器進程來說,LVMID與作業系統的進程ID(Process Identifier,PID)是一致的,使用Windows的工作管理員或者UNIX的ps命令也可以查詢到虛擬機器進程的LVMID,但如果同時啟動了多個虛擬機器進程,無法根據進程名稱定位時,那就只能依賴jps命令顯示主類的功能才能區分了。

jsp命令格式(jps可以通過RMI協議查詢開啟了RMI服務的遠程虛擬機器進程狀態,hostid為RMI註冊表中註冊的主機名稱):

jps options hostid

jps執行範例:

D:\Develop\Java\jdk1.6.0_21\bin>jps-l

2388 D:\Develop\glassfish\bin\..\modules\admin-cli.jar

2764 com.sun.enterprise.glassfish.bootstrap.ASMain

3788 sun.tools.jps.Jps

jps的其他常用選項見表4-2。

jstat:虛擬機器統計資訊監視工具

jstat(JVM Statistics Monitoring Tool)是用於監視虛擬機器各種運行狀態資訊的命令列工具。它可以顯示本地或者遠程(需要遠程主機提供RMI支援,Sun提供的jstatd工具可以很方便地建立遠程RMI伺服器)虛擬機器進程中的類裝載、記憶體、垃圾收集、JIT編譯等運行資料,在沒有GUI圖形介面,只提供了純文字控制台環境的伺服器上,它將是運行期定位虛擬機器效能問題的首選工具。 

jstat命令格式為:

jstat option vmid interval[s] count[ms]

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

protocol://[email protected]:port/servername

參數interval和count代表查詢間隔和次數,如果省略這兩個參數,說明只查詢一次。

假設需要每250毫秒查詢一次進程2764垃圾收集狀況,一共查詢20次,那命令應當是:

jstat -gc 2764 250 20

選項option代表著使用者希望查詢的虛擬機器資訊,主要分為3類:類裝載、垃圾收集、運行期編譯狀況,具體選項及作用請參考表4-3中的描述。

S0   S1     E    O    P    YGC  YGCT   FGC  FGCT   GCT

0.00  0.00   6.20  41.42  47.20  16   0.105   3    0.472   0.577

查詢結果表明:這台伺服器的新生代Eden區(E,表示Eden)使用了6.2%的空間,兩個Survivor區(S0、S1,表示Survivor0、Survivor1)裡面都是空的,老年代(O,表示Old)和永久代(P,表示Permanent)則分別使用了41.42%和47.20%的空間。程式運行以來共發生Minor GC(YGC,表示Young GC)16次,總耗時0.105秒,發生Full GC(FGC,表示Full GC)3次,Full GC總耗時(FGCT,表示Full GC Time)為0.472秒,所有GC總耗時(GCT,表示GC Time)為0.577秒。

jinfo:Java配置資訊工具

jinfo(Configuration Info for Java)的作用是即時地查看和調整虛擬機器各項參數。使用jps命令的-v參數可以查看虛擬機器啟動時顯式指定的參數列表,但如果想知道未被顯式指定的參數的系統預設值,除了去找資料外,就只能使用jinfo的-flag選項進行查詢了(如果只限於JDK 1.6或以上版本的話,使用java-XX:+PrintFlagsFinal查看參數預設值也是一個很好的選擇),jinfo還可以使用-sysprops選項把虛擬機器進程的System.getProperties()的內容列印出來。這個命令在JDK 1.5時期已經隨著Linux版的JDK發布,當時只提供了資訊查詢的功能,JDK 1.6之後,jinfo在Windows和Linux平台都有提供,並且加入了運行期修改參數的能力,可以使用-flag[+|-]name或者-flag name=value修改一部分運行期可寫的虛擬機器參數值。JDK 1.6中,jinfo對於Windows平台功能仍然有較大限制,只提供了最基本的-flag選項。

jinfo命令格式:

jinfo option pid

執行範例:查詢CMSInitiatingOccupancyFraction參數值。

C:\>jinfo-flag CMSInitiatingOccupancyFraction 1444

-XX:CMSInitiatingOccupancyFraction=85

jmap:Java記憶體映像工具

jmap(Memory Map for Java)命令用於產生堆轉儲快照(一般稱為heapdump或dump檔案)。如果不使用jmap命令,要想擷取Java堆轉儲快照,還有一些比較“暴力”的手段:譬如加-XX:+HeapDumpOnOutOfMemoryError參數,可以讓虛擬機器在OOM異常出現之後自動產生dump檔案,通過-XX:+HeapDumpOnCtrlBreak參數則可以使用[Ctrl]+[Break]鍵讓虛擬機器產生dump檔案,又或者在Linux系統下通過Kill-3命令發送進程退出訊號“嚇唬”一下虛擬機器,也能拿到dump檔案。

jmap的作用並不僅僅是為了擷取dump檔案,它還可以查詢finalize執行隊列、Java堆和永久代的詳細資料,如空間使用率、當前用的是哪種收集器等。和jinfo命令一樣,jmap有不少功能在Windows平台下都是受限的,除了產生dump檔案的-dump選項和用於查看每個類的執行個體、空間佔用統計的-histo選項在所有作業系統都提供之外,其餘選項都只能在Linux/Solaris下使用。

jmap命令格式:

jmap option vmid

option選項的合法值與具體含義見表4-4。

?  ~ jmap -dump:format=b,file=eclipse.bin 40195 

Dumping heap to /Users/*****/eclipse.bin ...

Heap dump file created

jhat:虛擬機器堆轉儲快照分析工具

jhat(JVM Heap Analysis Tool)命令與jmap搭配使用,來分析jmap產生的堆轉儲快照。jhat內建了一個微型的HTTP/HTML伺服器,產生dump檔案的分析結果後,可以在瀏覽器中查看。不過實事求是地說,在實際工作中,除非手上真的沒有別的工具可用,否則一般都不會去直接使用jhat命令來分析dump檔案,主要原因有二:一是一般不會在部署應用程式的伺服器上直接分析dump檔案,即使可以這樣做,也會盡量將dump檔案複製到其他機器。二是用於分析的機器一般也是伺服器,由於載入dump快照檔案需要比產生dump更大的記憶體,所以一般在64位JDK、大記憶體的伺服器上進行。

上進行分析,因為分析工作是一個耗時而且消耗硬體資源的過程,既然都要在其他機器進行,就沒有必要受到命令列工具的限制了;另一個原因是jhat的分析功能相對來說比較簡陋,VisualVM,以及專業用於分析dump檔案的Eclipse Memory Analyzer、IBM HeapAnalyzer等工具,都能實現比jhat更強大更專業的分析功能。【

?  ~ jhat eclipse.bin 

Reading from eclipse.bin...

Dump file created Mon Oct 31 19:32:57 CST 2016

Snapshot read, resolving...

Resolving 185857 objects...

Chasing references, expect 37 dots.....................................

Eliminating duplicate references.....................................

Snapshot resolved.

Started HTTP server on port 7000

Server is ready.

螢幕顯示“Server is ready.”的提示後,使用者在瀏覽器中鍵入http://localhost:7000/就可以看到分析結果.

分析結果預設是以包為單位進行分組顯示,分析記憶體流失問題主要會使用到其中的“Heap Histogram”(與jmap -histo功能一樣)與OQL頁簽的功能,前者可以找到記憶體中總容量最大的對象,後者是標準的物件查詢語言,使用類似SQL的文法對記憶體中的對象進行查詢統計.

jstack:Java堆疊追蹤工具

jstack(Stack Trace for Java)命令用於產生虛擬機器當前時刻的線程快照(一般稱為threaddump或者javacore檔案)。線程快照就是當前虛擬機器內每一條線程正在執行的方法堆棧的集合,產生線程快照的主要目的是定位線程出現長時間停頓的原因,如線程間死結、死迴圈、請求外部資源導致的長時間等待等都是導致線程長時間停頓的常見原因。線程出現停頓的時候通過jstack來查看各個線程的呼叫堆疊,就可以知道沒有響應的線程到底在後台做些什麼事情,或者等待著什麼資源。

jstack命令格式:

jstack option vmid

option選項的合法值與具體含義見表4-5。

?  ~ jstack -l 40195

在JDK 1.5中,java.lang.Thread類新增了一個getAllStackTraces()方法用於擷取虛擬機器中所有線程的StackTraceElement對象。使用這個方法可以通過簡單的幾行代碼就完成jstack的大部分功能,在實際項目中不妨調用這個方法做個管理員頁面,可以隨時使用瀏覽器來查看線程堆棧。

<%@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>

 

 

 

 

 

 

 

 

 

 

 

 

 

 

JDK的命令列工具

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.