tags: java, troubleshooting, monitor,jvisualvm,jconsolehtml
一句話歸納:jdk自己自帶的監控工具jconsole和jvisualvm能夠更方便,更直觀地對java應用進行性能監測,下文爲你講解如何使用它們。java
前面幾篇文章(見下文「相關閱讀」)已經對jdk的命令行工具進行了介紹,但它們使用起來相對仍是不夠直觀,並且通常都須要在本機上使用,有沒有更方便,更直觀的方式來對java應用進行監測?其實,jdk自己已經提供了java監測的GUI工具,分別是jconsole
和jvisualvm
,下面對這兩款工具的功能及使用進行描述。git
jconsole是jdk一個內置Java性能分析器,在JDK安裝目錄下的bin目錄,在windows下,能夠從命令行(jconsole.exe
)或直接雙擊jconsole.exe啓動運行。讀者有興趣能夠參考jconsole工具的官方使用文檔:https://docs.oracle.com/javase/8/docs/technotes/guides/management/jconsole.html
程序員
jconsole啓動時,會提供兩種鏈接方式,分別是鏈接本地進程和鏈接遠程進程。它會直接列出本地java進程來選擇。如果須要監測遠程的java進程,則勾選遠程進程,而後輸入:。這須要遠程的java進程啓動時,設置JMX的遠程鏈接參數,不然是沒法鏈接的,關於遠程鏈接的JMX技術,能夠參考官方文章(https://docs.oracle.com/javase/8/docs/technotes/guides/management/agent.html
)參數分別是如下幾個:github
# 須要監控的服務器IP
-Djava.rmi.server.hostname=192.168.222.10
# 提供監控的java進程端口
-Dcom.sun.management.jmxremote.port=9004
# 指定後續的通信端口,與上面一致
-Dcom.sun.management.jmxremote.rmi.port=9004
# 不使用ssl登陸,如有安全需求,可設置
-Dcom.sun.management.jmxremote.ssl=false
# 不驗證,如有安全需求,可設置
-Dcom.sun.management.jmxremote.authenticate=false
複製代碼
以下圖所示:shell
注意,因爲不使用ssl
,會提示"不安全鏈接",點擊它便可。數據庫
啓動並鏈接java進程後,jconsole的界面是比較簡潔的,分爲6個模塊:windows
概覽主要顯示堆,線程數,類,CPU佔用率的變化折線圖,基本上能夠直接根據折線圖來查看應用概況。若是堆佔用內存很高,活動線程數不少,CPU佔用率很高,那就能夠直接進入到相應的區域看詳細內容來查找緣由了。另外,右擊對應的圖,能夠把數據導出到csv文件來分析。如圖:安全
內存是咱們監測的重點區域,能夠參看堆內存,非堆內存,內存池的情況,GC次數和時間,能夠手動進行GC查看內存變化。以下圖:bash
其中,圖的上方能夠選擇查看哪一個內存的變化(堆、非堆,old區,eden區,survivor區,metaspace區等),也能夠手動執行GC查看變化狀況。圖下方有顯示內存的大小及使用大小,GC的次數和使用時間,同時以柱狀圖的方式來顯示堆和非堆的變化。所以,對於有內存溢出,OOM這些問題,看這裏的監測數據很是適合。
線上應用,線程長時間停頓的主要緣由主要有:等待外部資源(數據庫鏈接、網絡資源、設備資 源等)、死循環、鎖等待(活鎖和死鎖),這些都須要監測java應用的線程運行情況,以下圖:
線程數變化狀況及點擊某個線程查看運行狀態來分析,其中還能夠點擊「檢測死鎖」功能來處理死鎖問題。
此功能主要用於查看加載的類總數,若是加載的類一直在增長,就得查看代碼是否有不斷產生類的代碼了。以下圖:
當咱們對java應用添加了啓動參數( JAVA_OPTS
),若想在線上查看此應用的實際使用狀況,參數是否生效,命令行工具咱們是用jinfo,如今在這裏能夠直接看到,並且包括了系統信息,類信息,堆信息及相關的VM參數。以下圖:
與jconsole
相似,jdk在bin目錄下還提供了jvisualvm
工具,相對來講,jvisualvm
更爲強大,在windows下,能夠從命令行(jvisualvm.exe
)或直接雙擊jvisualvm.exe
啓動運行。讀者有興趣能夠參考jvisualvm
工具的官方使用文檔:https://docs.oracle.com/javase/8/docs/technotes/guides/visualvm/index.html
跟jconsole
同樣,jvisualvm
能夠監測本地的java進程,也能夠監測遠程的java進程。本地進程直接選擇便可,遠程進程一樣須要java進程添加JMX啓動參數。
jvisualvm的功能比較強大,主要包括如下幾項功能:
界面上的功能主要分爲幾大模塊,分別是概述、監視、線程、抽樣器。
概述至關是java命令行工具中的jps
及jinfo
,能夠顯示進程以及進程的配置、系統屬性,啓動參數等,與jconsole
的"VM概要"差很少。以下圖:
此功能至關於jconsole
的"概覽"功能,一樣是以圖形化的方式,顯示CPU、堆變化、線程數變化及加載類狀況,但它有一個功能是能夠遠程dump出堆轉儲快照(至關於jmap -dump:file=./heap.hprof PID
),dump時會選擇文件存儲位置。
dump出的堆快照,咱們能夠手動把文件下載下來,而後使用它的「裝入快照」功能加載到jvisualvm
(裝入時須要選擇文件類型是以"hprof"類型),進一步分析堆的內存狀況。裝入後,會包含概要信息,類和實例佔用內存狀況,雙擊類還能夠看到具體的實例數,如果發現某些類的實例數不少,或者佔用的內存大小比較高,則能夠知道問題所在。以下所示:
此此功能至關於jconsole
的"線程"功能,但更豐富,它把每一個線程的運行狀態,運行時間都以圖形化的方式顯示,同時還能夠進行遠程線程dump,這個功能,其實就是jstack -l
功能,dump出來後,直接顯示到界面中。以下:
抽樣器是jvisualvm
的獨有功能,能夠對CPU和內存進行抽樣顯示,每隔一段時間把內存信息,線程信息,能夠很方便的集中精力分析某一段時間的數據變化(能夠以層級方式顯示細到方法的執行時間,類佔用內存狀況等),同時也提供執行GC、內存dump及線程dump功能。以下:
有了jconsole
和jvisualvm
兩款可視化工具,能夠減小命令行的輸入,以更方便,更直觀的方式來監測java應用的內存、線程、CPU等信息,是處理java線上問題的好幫手。不過要注意一點的是,使用這兩款工具以前,咱們仍是須要對JVM,Java程序運行機制,線程等知識有必定的積累。但願本文對你們有幫助。
https://docs.oracle.com/javase/8/docs/technotes/guides/management/jconsole.html
https://docs.oracle.com/javase/8/docs/technotes/guides/visualvm/index.html
https://visualvm.github.io/documentation.html
https://docs.oracle.com/javase/8/docs/technotes/guides/management/agent.html
https://github.com/mianshenglee/my-example/tree/master/java-monitor-example