VisualVM是JDK自帶的一款全能型性能監控和故障分析工具,包括對CPU使用、JVM堆內存消耗、線程、類加載的實時監控,內存dump文件分析,垃圾回收運行狀況的可視化分析等,對故障排查和性能調優頗有幫助。在windows中安裝JDK後,VisualVM位於%JAVA_HOME%/bin/下,直接執行jvisualvm.exe便可。java
VisualVM鏈接遠程服務器有兩種方式:JMX和jstatd,兩種方式都不能完美支持全部功能,例如JMX不支持VisualGC,jstatd不支持CPU監控,實際使用可同時配置上並按需選用。windows
雙擊啓動 Java VisualVM 後能夠看到窗口左側 "應用程序 "欄中有" 本地 "、"遠程 " 、"快照 "三個項目。tomcat
"本地 "下顯示的是在 localhost 運行的 Java 程序的資源佔用狀況,若是本地有 Java 程序在運行的話啓動 Java VisualVM 便可看到相應的程序名,點擊程序名打開相應的資源監控菜單,以圖形的形式列出程序所佔用的 CPU 、 Heap 、 PermGen 、類、線程的 統計信息。安全
"遠程" 項下列出的遠程主機上的 Java 程序的資源佔用狀況,但須要在遠程主機上運行 jstatd 守護程序服務器
VisualVM分爲 3 類, 本地 它會自動偵測到,並顯示出來.工具
如今啓動IDEA.性能
雙擊Local 下的任一節點,看到右邊的變化 ,你能夠監控 CPU ,內存,類,線程等運行情況,實時監控服務器性能。spa
右鍵 VisualVM咱們能夠看到 Thread Dump, Heap Dump線程
作 Thread Dump 很快,立刻就能夠看到結果code
Heap Dump要稍花費一些時間(能夠看到當前 heap 裏對象的數量及佔用的比例,作 OOM 很好用)
1. 在服務器上安裝 jstatd 組件
jstatd工具是一個RMI服務器應用程序,主要用於監控HotSpot Java 虛擬機的建立與終止,並提供一個接口以容許遠程監控工具附加到本地主機上運行的JVM上。
使用apt-get 命令安裝 openjdk 便可 :
sudo apt-get install openjdk-6-jdk
2.在服務器上配置 jstatd 的 security policy 文件
jstatd是一個監控 JVM 從建立到銷燬過程當中資源佔用狀況並提供遠程監控接口的 RMI ( Remote Method Invocation ,遠程方法調用)服務器程序,它是一個 Daemon 程序,要保證遠程監控軟件鏈接到本地的話須要 jstatd 始終保持運行。
jstatd運行須要經過 -J-Djava.security.policy=*** 指定安全策略,所以咱們須要在服務器上創建一個指定安全策略的文件jstatd.all.policy ,在JAVA_HOME/bin目錄下建立jstatd.all.polic文件內容以下:
grant codebase "file:${java.home}/../lib/tools.jar" {
permission java.security.AllPermission;
};
3. 修改服務器 hosts 文件中的 IP 地址
要使Java VisualVM 成功鏈接到遠程服務器上,服務器端應該在 /etc/hosts 文件中把本機地址設爲本機的 IP 地址。使用 hostname -i 命令查看,若是顯示的是 127.0.0.1 或者與本機實際 IP 不一致的話,須要把 /etc/hosts 文件中相應的地址改成本機實際 IP 。
我使用的Linux,使用hostname -i 查看ip是否爲本身的外網IP(若是你僅僅是內網,是內網的IP,但不能是127.0.0.1或者localhost)
# localhost是本地環回地址,lack爲機器名,將localhost修改成對應ip # 如:10.10.23.10 lack localhost lack
4.運行 jstatd 守護程序
jstatd 須要保持一直運行,執行 jstatd 程序,命令以下:(注意:要在JAVA_HOME/bin目錄下運行該命令)
jstatd -J-Djava.security.policy=jstatd.all.policy &
5.經過Java VisualVM 鏈接到服務器監控 Java 程序
在Java VisualVM 程序窗口左側 " 遠程 " 項目右鍵選擇 " 添加遠程主機 " ,在彈出的對話框中輸入遠程主機的 IP 地址,確認提交後便可看到相應的遠程主機和在上面運行的 Java 程序,鏈接成功後應該會顯示 Jstatd 及其 PID 。
右擊遠程 選擇添加遠程主機:
若是從新指定了jstatd端口,選擇高級設置修改端口,以下圖:默認端口爲1099
添加後如圖所示:
三:Tomcat配置JMX
用hostname -i 查看是否爲127.0.0.1,這步很是重要,不然會鏈接失敗,若是是,必需要配置-Djava.rmi.server.hostname 好比個人配置爲 -Djava.rmi.server.hostname=192.168.8.7,而不須要修改hosts文件,修改此文件還可能影響到其餘程序。
只須要在TOMCAT_HOME/bin/找到catalina.sh 加上如下參數,從新啓動tomcat就能夠了:
JAVA_OPTS="$JAVA_OPTS -Djava.rmi.server.hostname=192.168.8.7 -Dcom.sun.management.jmxremote.port=8088 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"
注:1. -Dcom.sun.management.jmxremote.port :這個是配置遠程 connection 的端口號的,要肯定這個端口沒有被佔用
2. -Dcom.sun.management.jmxremote.ssl=false 指定了 JMX 是否啓用 ssl
3. -Dcom.sun.management.jmxremote.authenticate=false 指定了JMX 是否啓用鑑權(須要用戶名,密碼鑑權)
2,3兩個是固定配置,是 JMX 的遠程服務權限的
4. -Djava.rmi.server.hostname :這個是配置 server 的 IP 的
打開JAVA_HOME/bin/下的jvisualvm 或者jconsole 的工具能夠直接鏈接了,以下圖visualvm鏈接的示意圖:
不使用ssl就勾選最後一個「不要求ssl鏈接」,由於沒有身份證,因此也不勾選使用安全憑證。可是若是鏈接的是公網上的Tomcat,那麼就要注意安全性了,接下來看看使用用戶名和密碼鏈接
依然是在catalina.sh裏面,設置JAVA_OPTS
JAVA_OPTS='-Xms128m -Xmx256m -XX:MaxPermSize=128m -Djava.rmi.server.hostname=10.10.23.10 -Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=true -Dcom.sun.management.jmxremote.password.file=/usr/java/default/jre/lib/management/jmxremote.password -Dcom.sun.management.jmxremote.access.file=/usr/java/default/jre/lib/management/jmxremote.access'
/usr/java/default/jre/lib/management/jmxremote.password和/usr/java/default/jre/lib/management/jmxremote.access是兩個文件(在JAVA_HOME\jre\lib\management下有模板),如下分別編輯兩個文件
# /usr/java/default/jre/lib/management/jmxremote.password
#(12345六、123456789爲密碼)
monitorRole 123456
controlRole 123456789
# /usr/java/default/jre/lib/management/jmxremote.access monitorRole readonly controlRole readwrite
新建完成這兩個文件要修改jmxremote.password的權限
chmod 600 jmxremote.password
接下來就能夠遠程鏈接了