現實企業級Java開發中,有時候咱們會碰到下面這些問題:html
要解決這些問題,咱們須要掌握一些JVM的調優的命令,來幫助咱們來進行錯誤的定位。java
jps是最經常使用也是最基本的命令,該命令主要用於輸出JVM進程情況,例子以下:apache
jps(JVM Process Status) 有點相似UNIX中的ps命令,能夠列出正在運行的虛擬機進程,同時還能夠顯示出虛擬機運行主類(即main()所在的類)名稱以及進程在本機的虛擬機ID–LVMID(Local Virtual Machine Identifier),功能很簡單,但倒是使用頻率最高的命令行,由於後續的命令都要依據這個命令查出來的LVMID來進行操做。瀏覽器
jps [options] [hostid]
-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(JVM Memory Map)命令用於生成heap dump文件,若是不使用這個命令,還闊以使用-XX:+HeapDumpOnOutOfMemoryError參數來讓虛擬機出現OOM的時候·自動生成dump文件。 jmap不只能生成dump文件,還闊以查詢finalize執行隊列、Java堆和永久代的詳細信息,如當前使用率、當前使用的是哪一種收集器等。oracle
jmap [option] LVMID
-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(JVM statistics Monitoring)是用於監視虛擬機運行時狀態信息的命令,它能夠顯示出虛擬機進程中的類裝載、內存、垃圾收集、JIT編譯等運行數據。app
jstat [option] LVMID [interval] [count]
[option] : 操做參數 LVMID : 本地虛擬機進程ID [interval] : 連續輸出的時間間隔 [count] : 連續輸出的次數
$ jstat -gc 45995
jinfo(JVM Configuration info)這個命令做用是實時查看和調整虛擬機運行參數。 以前的jps -v口令只能查看到顯示指定的參數,若是想要查看未被顯示指定的參數的值就要使用jinfo口令.工具
jinfo [option] [args] LVMID
- -flag : 輸出指定args參數的值。 - -flags : 不須要args參數,輸出全部JVM參數的值。 - -sysprops : 輸出系統屬性,等同於System.getProperties()。
$ jinfo -flag 11494 -XX:CMSInitiatingOccupancyFraction=80
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虛擬機當前時刻的線程快照。線程快照是當前java虛擬機內每一條線程正在執行的方法堆棧的集合,生成線程快照的主要目的是定位線程出現長時間停頓的緣由,如線程間死鎖、死循環、請求外部資源致使的長時間等待等。 線程出現停頓的時候經過jstack來查看各個線程的調用堆棧,就能夠知道沒有響應的線程到底在後臺作什麼事情,或者等待什麼資源。 若是java程序崩潰生成core文件,jstack工具能夠用來得到core文件的java stack和native stack的信息,從而能夠輕鬆地知道java程序是如何崩潰和在程序何處發生問題。另外,jstack工具還能夠附屬到正在運行的java程序中,看到當時運行的java程序的java stack和native stack的信息, 若是如今運行的java程序呈現hung的狀態,jstack是很是有用的。
jstack [option] LVMID
-F : 當正常輸出請求不被響應時,強制輸出線程堆棧 -l : 除堆棧外,顯示關於鎖的附加信息 -m : 若是調用到本地方法的話,能夠顯示C/C++的堆棧
$ jstack -l 11494|more