jdk命令行工具詳解

現實企業級Java開發中,有時候咱們會碰到下面這些問題:html

  • OutOfMemoryError,內存不足。
  • 內存泄露。
  • 線程死鎖。
  • 鎖爭用(Lock Contention)。
  • Java進程消耗CPU太高。
  • ...

要解決這些問題,咱們須要掌握一些JVM的調優的命令,來幫助咱們來進行錯誤的定位。java

jps (輸出JVM進程情況)

jps是最經常使用也是最基本的命令,該命令主要用於輸出JVM進程情況,例子以下:apache

jps(JVM Process Status) 有點相似UNIX中的ps命令,能夠列出正在運行的虛擬機進程,同時還能夠顯示出虛擬機運行主類(即main()所在的類)名稱以及進程在本機的虛擬機ID–LVMID(Local Virtual Machine Identifier),功能很簡單,但倒是使用頻率最高的命令行,由於後續的命令都要依據這個命令查出來的LVMID來進行操做。瀏覽器

命令格式

jps [options] [hostid]

option參數:

-l: 輸出主類全名或jar路徑
 -q: 只輸出LVMID
 -m: 輸出JVM啓動時傳給main()的參數
 -v: 輸出JVM啓動時顯示指定的JVM參數

其中[option]、[hostid]參數也能夠不寫。服務器

示例

$ jps -l -m
  28920 org.apache.catalina.startup.Bootstrap start
  11589 org.apache.catalina.startup.Bootstrap start
  25816 sun.tools.jps.Jps -l -m

jmap(生成heap dump文件)

jmap(JVM Memory Map)命令用於生成heap dump文件,若是不使用這個命令,還闊以使用-XX:+HeapDumpOnOutOfMemoryError參數來讓虛擬機出現OOM的時候·自動生成dump文件。 jmap不只能生成dump文件,還闊以查詢finalize執行隊列、Java堆和永久代的詳細信息,如當前使用率、當前使用的是哪一種收集器等。oracle

命令格式

jmap [option] LVMID

option參數

-dump : 生成堆轉儲快照
-finalizerinfo : 顯示在F-Queue隊列等待Finalizer線程執行finalizer方法的對象
-heap : 顯示Java堆詳細信息
-histo : 顯示堆中對象的統計信息
-clstats : 顯示元空間內存狀態,ps:該口令是JDK8開始使用,以前是-permstat
-F : 當-dump沒有響應時,強制生成dump快照

示例

$ jmap -dump:live,format=b,file=dump.hprof 45995
Dumping heap to /Users/apple/dump.hprof ...
Heap dump file created

jstat(監視虛擬機運行時狀態信息)

jstat(JVM statistics Monitoring)是用於監視虛擬機運行時狀態信息的命令,它能夠顯示出虛擬機進程中的類裝載、內存、垃圾收集、JIT編譯等運行數據。app

命令格式

jstat [option] LVMID [interval] [count]

參數

[option] : 操做參數
LVMID : 本地虛擬機進程ID
[interval] : 連續輸出的時間間隔
[count] : 連續輸出的次數

option 參數總覽

示例

$ jstat -gc 45995

jinfo(實時查看和調整虛擬機運行參數)

jinfo(JVM Configuration info)這個命令做用是實時查看和調整虛擬機運行參數。 以前的jps -v口令只能查看到顯示指定的參數,若是想要查看未被顯示指定的參數的值就要使用jinfo口令.工具

命令格式

jinfo [option] [args] LVMID

option參數

-  -flag : 輸出指定args參數的值。
-  -flags : 不須要args參數,輸出全部JVM參數的值。
- -sysprops : 輸出系統屬性,等同於System.getProperties()。

示例

$ jinfo -flag 11494
-XX:CMSInitiatingOccupancyFraction=80

jhat(分析jmap生成的dump)

jhat(JVM Heap Analysis Tool)命令是與jmap搭配使用,用來分析jmap生成的dump,jhat內置了一個微型的HTTP/HTML服務器,生成dump的分析結果後,能夠在瀏覽器中查看。在此要注意,通常不會直接在服務器上進行分析,由於jhat是一個耗時而且耗費硬件資源的過程,通常把服務器生成的dump文件複製到本地或其餘機器上進行分析。優化

命令格式

jhat [dumpfile]

option參數命令行

-stack false|true
關閉對象分配調用棧跟蹤(tracking object allocation call stack)。 若是分配位置信息在堆轉儲中不可用. 則必須將此標誌設置爲 false. 默認值爲 true.

 -refs false|true
關閉對象引用跟蹤(tracking of references to objects)。 默認值爲 true. 默認狀況下, 返回的指針是指向其餘特定對象的對象,如反向連接或輸入引用(referrers or incoming references), 會統計/計算堆中的全部對象。

 -port port-number
設置 jhat HTTP server 的端口號. 默認值 7000.

 -exclude exclude-file
指定對象查詢時須要排除的數據成員列表文件(a file that lists data members that should be excluded from the reachable objects query)。 例如, 若是文件列列出了 java.lang.String.value , 那麼當從某個特定對象 Object o 計算可達的對象列表時, 引用路徑涉及 java.lang.String.value 的都會被排除。

 -baseline exclude-file
指定一個基準堆轉儲(baseline heap dump)。 在兩個 heap dumps 中有相同 object ID 的對象會被標記爲不是新的(marked as not being new). 其餘對象被標記爲新的(new). 在比較兩個不一樣的堆轉儲時頗有用.

 -debug int
設置 debug 級別. 0 表示不輸出調試信息。 值越大則表示輸出更詳細的 debug 信息.

  -version
啓動後只顯示版本信息就退出

 -J< flag >
由於 jhat 命令實際上會啓動一個JVM來執行, 經過 -J 能夠在啓動JVM時傳入一些啓動參數. 例如, -J-Xmx512m 則指定運行 jhat 的Java虛擬機使用的最大堆內存爲 512 MB. 若是須要使用多個JVM啓動參數,則傳入多個 -Jxxxxxx.

jstack(生成java虛擬機當前時刻的線程快照)

jstack用於生成java虛擬機當前時刻的線程快照。線程快照是當前java虛擬機內每一條線程正在執行的方法堆棧的集合,生成線程快照的主要目的是定位線程出現長時間停頓的緣由,如線程間死鎖、死循環、請求外部資源致使的長時間等待等。 線程出現停頓的時候經過jstack來查看各個線程的調用堆棧,就能夠知道沒有響應的線程到底在後臺作什麼事情,或者等待什麼資源。 若是java程序崩潰生成core文件,jstack工具能夠用來得到core文件的java stack和native stack的信息,從而能夠輕鬆地知道java程序是如何崩潰和在程序何處發生問題。另外,jstack工具還能夠附屬到正在運行的java程序中,看到當時運行的java程序的java stack和native stack的信息, 若是如今運行的java程序呈現hung的狀態,jstack是很是有用的。

命令格式

jstack [option] LVMID

option 參數

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

示例

$ jstack -l 11494|more

參考

相關文章
相關標籤/搜索