1. VisualVM是什么
按照VisualVM官網(http://visualvm.github.io/)上的介紹,VisualVM是一個集成命令行JDK工具和輕量級分析功能的可視化工具。專為開發和生產時間使用而設計。
我們在jdk安裝包中也可以發現它
2. IDEA安裝VisualVM插件
File-> Setting-> Plugins -> Browers Repositrories 搜索VisualVM Launcher安裝並重啟IDEA。
出現上圖中的兩個按鈕即為安裝成功,當我們通過他們啟動項目時,會自動打開VisualVM控制台面板。
3. VisualVM本地使用
右側有概述(Overview)、監視(Monitor)、線程(Threads)、抽樣器(Sampler)幾個標簽,其中
- 概述中可以看到程序的基本信息和啟動參數、環境變量等等;
- 監視是幾個折線圖,用於顯示CPU、內存(分為Heap和Metaspace)、類和線程的使用情況或者數量,另外還包括執行垃圾回收和對堆 Dump的快捷功能;
- 線程可詳細查看每個線程的運行時間及狀態等;
- 抽樣器可對CPU和內存進行一段時長的取樣,從而對應用程序進行分析。
使用時,可通過監視中的各個折線圖查看系統的變化,如果執行某段程序時,某個指標出現突然增大等問題,同時程序運行也出現問題,可進入到該面板做細致檢查。
如果某段程序執行時CPU飆升或者內存溢出,此時排除系統性能原因,多半是由於低效的代碼或者不合理的堆空間分配引起,可以在復現該問題的同時到抽樣器面板進行抽樣,從而確定應該優化哪個方法或者分配多大內存。
當對一個多線程應用程序進行調試或者開發后期做性能調優的時候,往往需要了解當前程序中所有線程的運行狀態,是否有死鎖、熱鎖等情況的發生,從而分析系統可能存在的問題。在 VisualVM 的監視標簽和線程標簽內,我們可以查看當前應用程序中所有活動線程(Live threads)和守護線程(Daemon threads)的數量等實時信息。
具體使用方法很直觀,不再一一介紹,如果要進行測試,可參考該篇博客:http://www.cnblogs.com/wade-xu/p/4369094.html
4. 遠程監視
在實際工作中,需要在本機監控的生產環境下的jvm,Visualvm目前支持兩種remote connection方式,分別是jstatd和JMX方式: 這里主要介紹的是通過JMX方式.。
4.1 修改遠程jvm配置
進入JAVA_HOME\jre\lib\management\,拷貝一份jmxremote.password.template 並改名為 jmxremote.password到當前目錄,並去掉# monitorRole QED 和 # controlRole R&D 這兩行前面的注釋符號。
[root@izbp1cq2wdg9kxunr0sz02z ~]# cd /usr/java/jdk/jdk1.8.0_172/jre/lib/management [root@izbp1cq2wdg9kxunr0sz02z management]# cp jmxremote.password.template jmxremote.password [root@izbp1cq2wdg9kxunr0sz02z management]# ls jmxremote.access jmxremote.password jmxremote.password.template management.properties snmp.acl.template [root@izbp1cq2wdg9kxunr0sz02z management]# vim jmxremote.password [root@izbp1cq2wdg9kxunr0sz02z management]# chmod 600 jmxremote.password [root@izbp1cq2wdg9kxunr0sz02z management]# chown root jmxremote.password
我這里使用的是默認的兩個遠程控制賬號,如果在 jmxremote.password 中自定義了遠程登錄賬號和密碼,需要修改同目錄下的jmxremote.access 文件,該文件可以控制訪問權限。
4.2 修改遠程機器上需要被監控的程序的配置文件
我這里是監控Tomcat容器內部署的應用
修改TOMCAT_HOME/bin/catalian.sh文件,添加
export JAVA_OPTS="-Djava.rmi.server.hostname=47.xx.xxx.xx1 -Dcom.sun.management.jmxremote.port=18999 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=true"
詳細參數如下
參數 | 描述 |
---|---|
com.sun.management.jmxremote | true / false. Default is true |
com.sun.management.jmxremote.port | Port number. No default. |
com.sun.management.jmxremote.ssl | true / false. Default is true. |
com.sun.management.jmxremote.ssl.enabled.protocols | Default SSL/TLS protocol version. |
com.sun.management.jmxremote.ssl.enabled.cipher.suites | Default SSL/TLS cipher suites. |
com.sun.management.jmxremote.ssl.need.client.auth | true / false. Default is false |
com.sun.management.jmxremote.authenticate | true / false.Default is true |
com.sun.management.jmxremote.password.file | JRE_HOME/lib/management/jmxremote.password |
com.sun.management.jmxremote.access.file | JRE_HOME/lib/management/jmxremote.access |
com.sun.management.jmxremote.login.config | Default login configuration is a file-based password authentication |
重啟tomcat。
可以用 netstat -anp| grep 18999 ,查看守護線程是否已經啟動。
4.3 VisualVM配置