java應用監測(5)-可視化監測工具

tags: java, troubleshooting, monitor,jvisualvm,jconsolehtml


一句話歸納:jdk自己自帶的監控工具jconsole和jvisualvm能夠更方便,更直觀地對java應用進行性能監測,下文爲你講解如何使用它們。java

1 引言

前面幾篇文章(見下文「相關閱讀」)已經對jdk的命令行工具進行了介紹,但它們使用起來相對仍是不夠直觀,並且通常都須要在本機上使用,有沒有更方便,更直觀的方式來對java應用進行監測?其實,jdk自己已經提供了java監測的GUI工具,分別是jconsolejvisualvm,下面對這兩款工具的功能及使用進行描述。git

2 jconsole使用

jconsole是jdk一個內置Java性能分析器,在JDK安裝目錄下的bin目錄,在windows下,能夠從命令行(jconsole.exe)或直接雙擊jconsole.exe啓動運行。讀者有興趣能夠參考jconsole工具的官方使用文檔https://docs.oracle.com/javase/8/docs/technotes/guides/management/jconsole.html程序員

2.1 兩種鏈接方式

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,會提示"不安全鏈接",點擊它便可。數據庫

2.2 jconsole功能使用

啓動並鏈接java進程後,jconsole的界面是比較簡潔的,分爲6個模塊:windows

  • 概述:對java進程的整體概覽,包括堆,線程數,類,CPU佔用率的變化折線圖。
  • 內存:顯示堆及非堆的內存使用信息,相似jmap和jstat
  • 線程:顯示線程使用信息,相似jstack
  • 類:顯示類裝載信息
  • VM摘要:顯示JVM信息,相似jinfo
  • MBeans:顯示MBeans信息(用得比較少)

2.2.1 概覽

概覽主要顯示堆,線程數,類,CPU佔用率的變化折線圖,基本上能夠直接根據折線圖來查看應用概況。若是堆佔用內存很高,活動線程數不少,CPU佔用率很高,那就能夠直接進入到相應的區域看詳細內容來查找緣由了。另外,右擊對應的圖,能夠把數據導出到csv文件來分析。如圖:安全

2.2.2 內存

內存是咱們監測的重點區域,能夠參看堆內存,非堆內存,內存池的情況,GC次數和時間,能夠手動進行GC查看內存變化。以下圖:bash

其中,圖的上方能夠選擇查看哪一個內存的變化(堆、非堆,old區,eden區,survivor區,metaspace區等),也能夠手動執行GC查看變化狀況。圖下方有顯示內存的大小及使用大小,GC的次數和使用時間,同時以柱狀圖的方式來顯示堆和非堆的變化。所以,對於有內存溢出,OOM這些問題,看這裏的監測數據很是適合。

2.2.3 線程

線上應用,線程長時間停頓的主要緣由主要有:等待外部資源(數據庫鏈接、網絡資源、設備資 源等)、死循環、鎖等待(活鎖和死鎖),這些都須要監測java應用的線程運行情況,以下圖:

線程數變化狀況及點擊某個線程查看運行狀態來分析,其中還能夠點擊「檢測死鎖」功能來處理死鎖問題。

2.2.4 類

此功能主要用於查看加載的類總數,若是加載的類一直在增長,就得查看代碼是否有不斷產生類的代碼了。以下圖:

2.2.5 VM概要

當咱們對java應用添加了啓動參數( JAVA_OPTS),若想在線上查看此應用的實際使用狀況,參數是否生效,命令行工具咱們是用jinfo,如今在這裏能夠直接看到,並且包括了系統信息,類信息,堆信息及相關的VM參數。以下圖:

3 jvisualvm使用

jconsole相似,jdk在bin目錄下還提供了jvisualvm工具,相對來講,jvisualvm更爲強大,在windows下,能夠從命令行(jvisualvm.exe)或直接雙擊jvisualvm.exe啓動運行。讀者有興趣能夠參考jvisualvm工具的官方使用文檔https://docs.oracle.com/javase/8/docs/technotes/guides/visualvm/index.html

3.1 兩種鏈接方式

jconsole同樣,jvisualvm能夠監測本地的java進程,也能夠監測遠程的java進程。本地進程直接選擇便可,遠程進程一樣須要java進程添加JMX啓動參數。

3.2 jvisualvm功能使用

jvisualvm的功能比較強大,主要包括如下幾項功能:

  • 顯示虛擬機進程以及進程的配置、環境信息(jps、jinfo)。
  • 監視應用程序的CPU、GC、堆、方法區(1.7及之前)、元空間(JDK1.8及之後)以及線程的信息,至關於jmap,jstat,jstack。
  • dump以及分析堆轉儲快照(jmap,jhat)。
  • 方法級的程序運行性能分析,找出被調用最多、運行時間最長的方法。
  • 離線程序快照:收集程序的運行時配置、線程dump、內存dump等信息創建一個快照

界面上的功能主要分爲幾大模塊,分別是概述、監視、線程、抽樣器。

3.2.1 概述

概述至關是java命令行工具中的jpsjinfo,能夠顯示進程以及進程的配置、系統屬性,啓動參數等,與jconsole的"VM概要"差很少。以下圖:

3.2.2 監視

此功能至關於jconsole的"概覽"功能,一樣是以圖形化的方式,顯示CPU、堆變化、線程數變化及加載類狀況,但它有一個功能是能夠遠程dump出堆轉儲快照(至關於jmap -dump:file=./heap.hprof PID),dump時會選擇文件存儲位置。

dump出的堆快照,咱們能夠手動把文件下載下來,而後使用它的「裝入快照」功能加載到jvisualvm(裝入時須要選擇文件類型是以"hprof"類型),進一步分析堆的內存狀況。裝入後,會包含概要信息,類和實例佔用內存狀況,雙擊類還能夠看到具體的實例數,如果發現某些類的實例數不少,或者佔用的內存大小比較高,則能夠知道問題所在。以下所示:

3.2.3 線程

此此功能至關於jconsole的"線程"功能,但更豐富,它把每一個線程的運行狀態,運行時間都以圖形化的方式顯示,同時還能夠進行遠程線程dump,這個功能,其實就是jstack -l功能,dump出來後,直接顯示到界面中。以下:

3.2.4 抽樣器

抽樣器是jvisualvm的獨有功能,能夠對CPU和內存進行抽樣顯示,每隔一段時間把內存信息,線程信息,能夠很方便的集中精力分析某一段時間的數據變化(能夠以層級方式顯示細到方法的執行時間,類佔用內存狀況等),同時也提供執行GC、內存dump及線程dump功能。以下:

4 總結

有了jconsolejvisualvm兩款可視化工具,能夠減小命令行的輸入,以更方便,更直觀的方式來監測java應用的內存、線程、CPU等信息,是處理java線上問題的好幫手。不過要注意一點的是,使用這兩款工具以前,咱們仍是須要對JVM,Java程序運行機制,線程等知識有必定的積累。但願本文對你們有幫助。

參數資料

相關閱讀

相關文章
相關標籤/搜索