在JAVA開發與運維中,常常會碰見一些須要監控JVM性能的問題。例如
* 內存不足
* 線程死鎖
* java進程消耗CPU太高html
能夠輸出並修改運行時的java 進程的opts。用處比較簡單,用於輸出JAVA系統參數及命令行參數java
命令格式:
jps [ options ]
options :
-m 輸出傳遞給main方法的參數,若是是內嵌的JVM則輸出爲null。
-l 輸出應用程序主類的完整包名,或者是應用程序JAR文件的完整路徑。
-v 輸出傳給JVM的參數。算法
用來查看正在運行的java應用程序的擴展參數(JVM中-X標示的參數);支持在運行時修改部分參數。
格式
jinfo [ option ] pid
jinfo [ option ] executable core 編程
參數說明
pid 對應jvm的進程id
executable core 產生core dump文件設計模式
options:
no option 輸出所有的參數和系統屬性
-flag name 輸出對應名稱的參數
-flag [+|-]name 開啓或者關閉對應名稱的參數
-flag name=value 設定對應名稱的參數
-flags 輸出所有的參數
-sysprops 輸出系統屬性緩存
使用 java -XX:+PrintFlagsFinal -version|grep manageable 能看到JVM中哪些flag能夠被jinfo動態修改
舉例 : 正在運行的JVM中動態開啓GC日誌功能:
jinfo -flag +PrintGCDetails pid
jinfo -flag +PrintGC pid網絡
主要用來查看Java線程的調用堆棧的,能夠用來分析線程問題(如 死鎖 CPU彪高,程序卡住,系統無響應,居家必備之良藥)
格式
jstack [ option ] pid
jstack [ option ] executable core
options:
-F 強制dump線程堆棧信息. 用於進程hung住, jstack 命令沒有響應的狀況
-m 同時打印java和本地(native)線程棧信息,m是mixed mode的簡寫
-l 打印鎖的額外信息oracle
線程狀態 咱們使用jstack命令查看線程堆棧信息時可能會看到的線程的幾種狀態: NEW,未啓動的。不會出如今Dump中。 RUNNABLE,在虛擬機內執行的。運行中狀態,可能裏面還能看到locked字樣,代表它得到了某把鎖。 BLOCKED,受阻塞並等待監視器鎖。被某個鎖(synchronizers)給block住了。 WATING,無限期等待另外一個線程執行特定操做。等待某個condition或monitor發生,通常停留在park(), wait(), sleep(),join() 等語句裏。 TIMED_WATING,有時限的等待另外一個線程的特定操做。和WAITING的區別是wait() 等語句加上了時間限制 wait(timeout)。 TERMINATED,已退出的。 https://www.cnblogs.com/kongzhongqijing/articles/3630264.html
能夠輸出全部內存中對象的,甚至能夠將VM 中的heap,以二進制輸出成文本。打印出某個java進程內存使用情況,以及對象數量。
格式
jmap [ option ] pid
jmap [ option ] executable core運維
options:
-dump:[live,]format=b,file=
使用hprof二進制形式,輸出jvm的heap內容到文件. live子選項是可選的,假如指定live選項,
那麼只輸出活的對象到文件.
-finalizerinfo 打印正等候回收的對象的信息.
-heap 打印heap的概要信息,GC使用的算法,heap的配置及wise heap的使用狀況.
-histo[:live] 打印每一個class的實例數目,內存佔用,類全名信息.加上live子參數,只統計活的對象數量.
-clstats 打印類加載器的統計信息(取代了在JDK8以前打印類加載器信息的permstat)
-F 強迫.在pid沒有相應的時候使用-dump或者-histo參數. 在這個模式下,live子參數無效.
-J 傳遞參數給jmap啓動的jvm.jvm
主要是用來分析java堆的命令,能夠將堆中的對象以html的形式顯示出來,包括對象的數量,大小等等,並支持對象查詢語言。
導出堆 :
1) jmap 導出
2) -XX:+HeapDumpOnOutOfMemoryError
3) hprof
https://www.cnblogs.com/baihuitestsoftware/articles/6406271.html
http://www.javashuo.com/article/p-enteeqlj-bv.html
用來監視VM內存內的各類堆和非堆的大小及其內存使用量。詳細查看堆內各個部分的使用量,以及加載類的數量。
格式
jstat - [-t] [-h] [ []]
-t 能夠在打印的列加上Timestamp列,用於顯示系統運行的時間 -h 能夠在週期性數據數據的時候,能夠在指定輸出多少行之後輸出一次表頭 interval 間隔時間,單位爲毫秒 count 用於指定輸出多少次記錄,缺省則會一直打印
https://www.cnblogs.com/baihuitestsoftware/articles/6406271.html
https://www.jianshu.com/p/213710fb9e40
http://www.javashuo.com/article/p-enteeqlj-bv.html
生產環境不要開放
它用於鏈接正在運行的本地或者遠程的JVM,對運行在java應用程序的資源消耗和性能進行監控,並畫出大量的圖表,提供強大的可視化界面。
JMX在Java編程語言中定義了應用程序以及網絡管理和監控的體系結構、設計模式、應用程序接口以及服務。
一般使用JMX來監控系統的運行狀態或管理系統的某些方面,好比清空緩存、從新加載配置文件等
https://www.cnblogs.com/baihuitestsoftware/articles/6405580.html
https://docs.oracle.com/javase/1.5.0/docs/guide/management/jconsole.html