上篇博客我們介紹了虛擬機監控和分析命令行工具,由於其不夠直觀,不是很容易排查問題,那么本篇博客我們就來介紹幾個可視化工具。
1、JConsole
JConsole(Java Monitoring and Management Console)是一款基於 JMX 的可視化監視和管理的工具。它管理部分的功能是針對 JMX MBean 進行管理,MBean 可以使用代碼、中間件服務器的管理控制台或者所有符合 JMX 規范的軟件進行訪問。
JMX(Java Management Extensions)是一個為應用程序植入管理功能的框架,一套標准的代理和服務;MBean就是一種規范的JavaBean,通過集成和實現一套標准的Bean接口。
①、啟動 JConsole
這是我們JDK自帶的監控工具,在JDK的安裝目錄bin下即可找到。
如果配置過JDK環境變量,在CMD命令提示符中輸入 jconsole 也可直接打開。
這是一個可執行文件,直接雙擊即可打開。打開如下:
②、監控界面介紹
JConsole 這個監控工具可以監控本地進程以及遠程進程,我們這里以監控本地進程為例,來介紹具體的監控界面。
點擊本地進程下面的任意一欄,進入到監控界面。
1、監控概覽
這個界面是我們建立本地連接后,進入的第一個頁面。顯示的是整個虛擬機主要運行數據的概覽,包括“堆使用情況”、“線程”、“類”、“CPU占用率”等四項信息的曲線圖,這些曲線圖是后面“內存”、“線程”、“類”頁簽的信息匯總,下面會分別介紹這幾個頁簽。
2、內存監控
這個頁簽相當於上一篇博客介紹的jstat命令,不過這里是可視化的。用於監視虛擬機內存的一些變化趨勢。
監視區域如下:
3、線程監控
這個頁簽相當於上篇博客介紹的可視化的jstat 命令。遇到線程停頓的時候可以使用這個頁簽進行監控分析。
另外,此頁面左下角還有一個檢測死鎖的按鈕,出現線程死鎖后,點擊此按鈕,便會出現一個新的死鎖頁簽。
比如,對於如下這段死鎖代碼:
1 @GetMapping("/test2") 2 public void test2() throws Exception{ 3 Object lock1 = new Object(); 4 Object lock2 = new Object(); 5 6 new Thread(()->{ 7 synchronized (lock1){ 8 try { 9 Thread.sleep(1000); 10 } catch (InterruptedException e) { 11 e.printStackTrace(); 12 } 13 synchronized (lock2){ 14 System.out.println("線程1結束運行"); 15 } 16 } 17 }).start(); 18 19 new Thread(()->{ 20 synchronized (lock2){ 21 try { 22 Thread.sleep(1000); 23 } catch (InterruptedException e) { 24 e.printStackTrace(); 25 } 26 synchronized (lock1){ 27 System.out.println("線程2結束運行"); 28 } 29 } 30 }).start(); 31 }
這里創建了兩把鎖,lock1,lock2,創建了兩個線程,線程1獲取到lock1后,說你給我lock2,我就釋放lock1;而線程2獲取到lock2后,說你給我lock1,我就釋放lock2。兩個線程誰也不釋放,於是便造成了死鎖現象。
通過監控工具便可以檢測到,如下:
4、類監控
5、VM概要
展示一些JVM信息。
③、配置Tomcat遠程監控
其實使用監控工具,我們很少對本地的程序進行監控,大多數情況都是對部署在遠程Linux服務器上的程序進行監控,那么想要使用 JConsole這款工具進行遠程監控,我們必須要進行一些配置。我們首先介紹對Tomcat的遠程監控。
1、配置catalina.sh
在該文件下加入如下配置信息:
JAVA_OPTS="$JAVA_OPTS -Djava.rmi.server.hostname=192.168.146.200 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false"
-Dcom.sun.management.jmxremote 表示開啟遠程連接。
-Dcom.sun.management.jmxremote.port=9004 表示設置遠程連接端口為1099
-Dcom.sun.management.jmxremote.authenticate=false 表示不需要密碼驗證
-Dcom.sun.management.jmxremote.ssl=fals 表示不需要開啟ssl連接
-Djava.net.preferIPv4Stack=true 表示只支持IPV4地址
-Djava.rmi.server.hostname=192.168.146.200 表示監控的主機名為192.168.146.200
添加位置如下:
2、建立連接
通過上面的配置,啟動Tomcat后,我們只需要在 JConsole 的遠程連接界面,輸入 192.168.146.200:9004 ,然后點擊連接即可。
3、連接錯誤情況
如果無法連接,需要依次檢測如下信息:
①、配置的端口不能被占用,可以通過 netstat -tunlp|grep 1099 命令驗證。
②、防火牆開啟對上面設置端口的信任
③、通過 hostname -i 命令,如果打印的不是前面設置的ip地址,則需要通過 vim /etc/hosts 命令,將127.0.0.1 修改為本機IP地址。
④、配置遠程jar包監控
啟動jar包的命令如下:
nohup java -Djava.rmi.server.hostname=192.168.146.200 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1089 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -jar jvm-0.0.1-SNAPSHOT.jar &
配置端口,ip地址,和遠程監控Tomcat大體上是一樣的,然后建立連接即可。
2、JVisualVM
英文介紹為 All-in-One Java Troubleshooting Tool。聽名字我們就知道這是一塊功能很全,很強大的Java運行監視和故障處理工具,並且是官方主力發展的虛擬機故障處理工具,其性能分析比很多專業收費軟件都不會遜色多少。
①、啟動 JVisualVM
和前面介紹的JConsole工具一樣,這也是 JDK 自帶的一個工具,在安裝目錄bin下,可以直接雙擊啟動。
打開界面如下:
②、監控界面介紹
其實大體界面和JConsole差不多。
抽樣器可以對CPU,內存進行詳細監控統計。
③、插件機制
JVisualVM 比較強大的地方在與可以安裝各種插件,提供各種不同的功能。
點擊上方菜單欄 工具---》插件:
然后設置插件中心的地址:
這個地址,我們可以到這個網址上去獲取:
https://visualvm.github.io/pluginscenters.html
選擇對應的插件地址時,要根據我們的JDK版本來選定。
比如,我這邊的JDK版本如下:
那么選擇的地址如下(152,介於131-221之間):
設置好下載地址后,我們這邊選擇需要的插件,點擊安裝即可!比如比較常用的插件 Visual GC(用來查看GC日志)
安裝完成之后,我們便可以在頁簽上看到這個新增的插件。
④、配置遠程連接
不管是遠程連接Tomcat還是jar包,都和介紹JConsole一模一樣,詳情請參考上面的配置。
⑤、使用文檔
對於JVisualvm,官方有詳細的中文文檔說明,如下:
https://visualvm.github.io/documentation.html