JVM監控命令大全
1、jdb(The Java Debuger)
jdb 用來對core檔案和正在執行的Java程序進行實時地除錯,裡面包含了豐富的命令幫助您進行除錯,它的功能和Sun studio裡面所帶的dbx非常相似,但 jdb是專門用來針對Java應用程式的。
現在應該說日常的開發中很少用到JDB了,因為現在的IDE已經幫我們封裝好了,如使用ECLIPSE呼叫程式就是非常方便的,只要在非常特定的情況下可能會用到這個命令,如遠端伺服器的維護,沒有IDE進行除錯,那這個時候JDB應該可以幫上忙。
2、jstatd(JVM monitoring tool jstatd)
jstatd是一個基於RMI(Remove Method Invocation)的服務程式,它用於監控基於HotSpot的JVM中資源的建立及銷燬,並且提供了一個遠端介面允許遠端的監控工具連線到本地的JVM執行命令。
jstatd是基於RMI的,所以在執行jstatd的伺服器上必須存在RMI註冊中心,如果沒有通過選項"-p port"指定要連線的埠,jstatd會嘗試連線RMI註冊中心的預設埠。
Option | Function |
-nr | 如果RMI註冊中心沒有找到,不會建立一個內部的RMI註冊中心 |
-p port | RMI註冊中心的埠號,預設為1099 |
-n rminame | 預設為JStatRemoteHost |
-j | 用於傳遞jvm選項到由javac呼叫的java載入器中 |
3、jinfo(JVM configuration Info for Java)
jinfo的作用是實時檢視虛擬機器的各項引數資訊jps –v可以檢視虛擬機器在啟動時被顯式指定的引數資訊,但是如果你想知道預設的一些引數資訊呢?除了去查詢對應的資料以外,jinfo就顯得很重要了。jinfo的用法如下:
引數選項說明如下:
Option | Function |
no option | 輸出命令列引數和系統屬性 |
-flags | 輸出命令列引數 |
-sysprops | 輸出系統屬性 |
4、jps(Java Virtual Machine Process Status Tool)
jps是參照Unix系統的取名規則命名的,而他的功能和ps的功能類似,可以列舉正在執行的JAVA虛擬機器程序並顯示虛擬機器執行的主類以及這些程序的唯一ID(LVMID,對應本機來說和PID相同),他的用法如下:
如果不指定hostid就預設為當前主機或伺服器
引數選項說明如下:
Option | Function |
-q | 只輸出LVMID |
-m | 輸出JVM啟動時傳給主類的方法 |
-l | 輸出主類的全名,如果是Jar則輸出jar的路徑 |
-v | 輸出JVM的啟動引數 |
5、jstack(JVM Stack Trace for java)
jstack用於JVM當前時刻的執行緒快照,又稱threaddump檔案,它是JVM當前每一條執行緒正在執行的堆疊資訊的集合。生成執行緒快照的主要目的是為了定位執行緒出現長時間停頓的原因,如執行緒死鎖、死迴圈、請求外部時長過長導致執行緒停頓的原因。通過jstack我們就可以知道哪些程序在後臺做些什麼?在等待什麼資源等!其執行格式如下:
相關的option和function如下表所示:
Option | Function |
-F | 當正常輸出的請求不響應時強制輸出執行緒堆疊 |
-l | 除堆疊資訊外,顯示關於鎖的附加資訊 |
-m | 顯示native方法的堆疊資訊 |
6、jstat(JVM Statistics Monitoring Tools)
jstat主要用於監控虛擬機器的各種執行狀態資訊,如類的裝載、記憶體、垃圾回收、JIT編譯器等,在沒有GUI的伺服器上,這款工具是首選的一款監控工具。其用法如下:
引數interval和count分別表示查詢間隔和查詢次數,如每2000毫秒查詢一次程序2053的垃圾回收情況,監控5次,命令如下所示:
選項option代表使用者需要查詢的虛擬機器的資訊,主要分為3類:類裝載、垃圾回收和執行期的編譯情況,具體如下表所示:
Option | Function |
-class | 監視類的裝載、解除安裝數量以及類的裝載總空間和耗費時間等 |
-gc | 監視Java堆,包含eden、2個survivor區、old區和永久帶區域的容量、已用空間、GC時間合計等資訊 |
-gccapcity | 監視內容與-gc相同,但輸出主要關注Java區域用到的最大和最小空間 |
-gcutil | 監視內容與-gc相同,但輸出主要關注已使用空間佔總空間的百分比 |
-gccause | 與-gcutil輸出資訊相同,額外輸出導致上次GC產生的原因 |
-gcnew | 監控新生代的GC情況 |
-gcnewcapacity | 與-gcnew監控資訊相同,輸出主要關注使用到的最大和最小空間 |
-gcold | 監控老生代的GC情況 |
-gcoldcapacity | 與-gcold監控資訊相同,輸出主要關注使用到的最大和最小空間 |
-gcpermcapacity | 輸出永久帶用到的最大和最小空間 |
-compiler | 輸出JIT編譯器編譯過的方法、耗時資訊 |
-printcompilation | 輸出已經被JIT編譯的方法 |
7、jmap(JVM Memory Map for Java)
jmap用於生成堆快照(heapdump)。當然我們有很多方法可以取到對應的dump資訊,如我們通過JVM啟動時加入啟動引數 –XX:HeapDumpOnOutOfMemoryError引數,可以讓JVM在出現記憶體溢位錯誤的時候自動生成dump檔案,亦可以通過-XX:HeapDumpOnCtrlBreak引數,在執行時使用ctrl+break按鍵生成dump檔案,當然我們也可以使用kill -3 pid的方式去恐嚇JVM生成dump檔案。jmap的作用不僅僅是為了獲取dump檔案,還可以用於查詢finalize執行佇列、Java堆和永久帶的詳細資訊,如空間使用率、垃圾回收器等。其執行格式如下:
Option的資訊如下表所示:
Option | Function |
-dump | 生成對應的dump資訊,用法為-dump:[live,]format=b,file={fileName} |
-finalizerinfo | 顯示在F-Queue中等待的Finalizer方法的物件(只在linux下生效) |
-heap | 顯示堆的詳細資訊、垃圾回收器資訊、引數配置、分代詳情等 |
-histo | 顯示堆疊中的物件的統計資訊,包含類、例項數量和合計容量 |
-permstat | 以ClassLoder為統計口徑顯示永久帶的記憶體狀態 |
-F | 當虛擬機器對-dump無響應時可使用這個選項強制生成dump快照 |
8、jhat(JVM Heap Analysis Tool)
jhat是用來分析dump檔案的一個微型的HTTP/HTML伺服器,它能將生成的dump檔案生成線上的HTML檔案,讓我們可以通過瀏覽器進行查閱,然而實際中我們很少使用這個工具,因為一般伺服器上設定的堆、棧記憶體都比較大,生成的dump也比較大,直接用jhat容易造成記憶體溢位,而是我們大部分會將對應的檔案拷貝下來,通過其他視覺化的工具進行分析。啟用法如下:
執行命令後,我們看到系統開始讀取這段dump資訊,當系統提示Server is ready的時候,使用者可以通過在瀏覽器鍵入http://ip:7000進行查詢,如下圖: