目錄
一、GC日誌可視化分析工具
1. 概述
本文選取https://fasterj.com/tools/gcloganalysers.shtml 中按更新日期排序的GC日誌分析工具的前四個,好處:目前都還有人維護;
實驗GC日誌生成參數:-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/Desktop/gc.txt;
JDK8;macOS;
工具包含主要指標(Metrics):JVM Heap Size(Generation / Allocated space / before GC / after GC);Throughput;Pause(Minor GC / Full GC / count);Reclaimed Bytes;GC count;GC causes;Allocatied Objects Size;Promoted Object Size;created bytes;
本地部署的工具比在線工具快;
2. GCeasy
部署 https://gceasy.io/index.jsp#features
1. 將GC日誌文件gc.txt壓縮成zip;
2. 訪問https://gceasy.io/index.jsp#features,完全在線,上傳zip;
3. Analyze,多等一會,將會展示數據和圖表;
3. GCPlot
部署(同官網)https://gcplot.com/
1. 安裝docker;
2. 在終端運行命令:docker run -d -p 80:80 gcplot/gcplot;
3. 在瀏覽器訪問地址:http://127.0.0.1;用戶名和密碼,均爲admin;
4. General --> Upload GC Log --> 選擇文件 --> 點擊Upload按鈕;
5. Analysis Groups --> Files --> 點擊上傳的GC日誌gc.txt --> 將會JVM info,指標按tab頁分類;
4. JClarity
部署(付費)https://www.jclarity.com/censum/
1. 在官網選擇試用,填寫信息(郵箱),將會收到下載地址和uuid;
2. 在下載頁輸入郵箱、uuid、操作系統,點擊submit,將會收到包含licence key的郵件,瀏覽器將下載安裝包;
3. (macOS下載tgz)雙擊tgz文件,將解壓後目錄下的文件移動到應用程序目錄下,在啓動臺點擊icon運行;
4. 首次運行輸入licence key;
5. 點擊Analyse a GC Log;上傳GC日誌文件gc.txt;
6. 將會展示分析結果和建議(ANALYTICS,如👇圖所示)、圖表和數據(GRAPHS AND DATA);
5. GcViewer
部署 https://github.com/chewiebug/GCViewer
1. 下載工程;
2. 在Intellij idea中打開;運行com.tagtraum.perf.gcviewer.GCViewer類型的main函數;
3. 點擊左上角打開GC日誌文件gc.txt;(View菜單可調整折線圖及圖例,圖表分辨率可調整,如下👇圖)
二、JVM狀態可視化(JVisualVM)
1. 概述
建議與被監控程序運行在不同機器上(遠程監控)。
安裝插件讓JVisualVM完整。(常用:Virsul GC、MBeans)
2. 運行
在$JAVA_HOME/bin目錄下,運行jvisualvm命令
啓動時多等一會,將會在左側菜單欄看見本地Java應用
3. 安裝插件
JVisualVM插件說明 https://visualvm.github.io/plugins.html
菜單欄 --> 工具(T) --> 插件(P) --> 可用插件 --> 全選,安裝
配置JConsole Plugins
1. 下載https://github.com/TheLQ/GamersClub/tree/master/build/bcf736a518834fe7aa689d74d5ca1b/demo/management/JTop JTop.jar;
2. 左側菜單欄,本地 --> 雙擊VisualVM,進入VisualVM監控頁--> 在右側監控頁,選擇"JConsole Plugins" tab頁,看見no jconsole plugin installed提示,點擊configure plugins按鈕,將JTop.jar添加進來,應用並重啓JVisualVM;
4. 遠程監控
遠程機器操作系統:Linux
4.1 jstatd連接
1. 在/etc/hosts文件末尾增加一行:
該機器ip(可通過ifconfig命令獲得) hostname(可通過hostname命令獲得)
2. 在遠程機器$JAVA_HOME/bin目錄下,新建jstatd.all.policy文件,內容如下:
grant codebase "file:${java.home}/../lib/tools.jar" {
permission java.security.AllPermission;
};
3. 在遠程機器$JAVA_HOME/bin目錄下,執行命令:jstatd -J-Djava.security.policy=jstatd.all.policy &,將後臺運行,執行成功情況下不輸出任何信息;
4. 測試是否能遠程監控Java程序,在本機執行命令:jps 遠程機器ip,將輸出遠程機器上的Java進程
5. JVisualVM左側菜單欄,遠程,右鍵 --> 添加遠程主機 --> 輸入遠程主機IP --> 左側菜單欄,遠程主機IP上右鍵 --> 添加jstatd連接,默認端口1099;若成功,左側菜單欄遠程主機IP下,將看到jstatd進程及其它運行在遠程主機上的Java進程,以及它們的pid;
4.2 JMX連接(以Tomcat爲例)
1. 編輯Tomcat的bin目錄下的catalina.sh,在首部註釋塊之後添加:(jmxremote.port端口號可修改爲任一未被佔用的端口號)
JAVA_OPTS="-Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false"
2. 重啓Tomcat;(配置了JMX連接的Tomcat,shutdown關閉時會報錯誤,無法關閉,Error: Exception thrown by the agent : java.rmi.server.ExportException: Port already in use: 9999; 此時kill -9 殺死佔用9999端口的進程即可,即關閉Tomcat進程;)
3. JVisualVM左側菜單欄 --> 遠程主機IP上右鍵 --> 添加JMX連接 --> IP後添加jmxremote.port指定的端口號,勾選不要求SSL連接;若成功,左側菜單欄遠程主機IP下,將看到帶JMX logo的進程;
使用安全憑證,可參考:https://www.cnblogs.com/sunshine-2015/p/5547128.html