使用JDK自帶的visualvm進行性能監測和調優
1.關於VisualVm工具
VisualVM 提供在 Java 虛擬機 (Java Virutal Machine, JVM) 上運行的 Java 應用程序的詳細信息。在 VisualVM 的圖形用戶界面中,您可以方便、快捷地查看多個 Java 應用程序的相關信息。
入門指南(中文版)地址:http://visualvm.java.net/zh_CN/gettingstarted.html
在進行性能監測前,先安裝好相關的插件
2.監控本機的java程序
(1)啟動VisualVm
在Windows系統中,VisualVm工具的路徑為:JDK根目錄\bin\jvisualvm.exe
(2)點擊啟動界面左側的樹中要進行檢測的java應用程序
3.監控遠程機器的java程序
(1)首先要在要監控的遠程機器上啟動jstatd監控進程,具體命令介紹如下:
概述
jstatd [可選參數]
參數
可選參數
命令行參數。這些參數可以是任意次序的,如果存在冗余或互斥的參數,最后一個指定選項將被優先考慮。
描述
jstatd工具是一個RMI服務程序,用來監控HotSpot Java虛擬機(JVMS)的創建和終止,並提供一個接口以允許遠程的監控工具依附到本地運行的Java虛擬機上。
jstatd服務需要在本地主機上存在一個RMI注冊。jstatd服務將試圖在默認端口上連接RMI注冊,或者在 -p 端口號 所指定的端口上。如果沒有找到RMI注冊,則會在jstatd應用程序中創建一個並綁定到-p 端口號 參數所指定的端口,如果未指定端口號,則綁定到默認端口。可以通過指定的-nr 參數來控制是否創建一個內部的RMI注冊。
提示:在未來版本的JDK這個工具可能是不被支持的,或者不可用的。而且目前無法在Windows 98和Windows ME 平台使用。
可選參數
jstatd 命令支持以下參數:
-nr 當未找到一個存在的RMI注冊時,不要嘗試在jstatd進程內部創建一個內建的RMI注冊。
-p 端口號 指定一個期望發現RMI注冊的端口號,或者,如果沒有發現,在未指定 -nr參數的情況下創建一個
-n rmi名稱 指定在RMI注冊中發現的遠程RMI對象的名字。缺省的名字是JStatRemoteHost,如果在一個主機中啟動了多個jstatd服務器,可以用 該參數指定每個導出的RMI對象的名字。無論如何,唯一的服務器名稱也將被包含在監控器客戶端的hostid和vmid字符串中。
-J 選項 傳遞參數給javac調用的java啟動程序,例如 -J -Xms48m將設置啟動內存為48m。這是一種給VM下運行的Java應用程序傳遞參數的慣用手法。
安全性
jstatd 服務器僅能監控它有本地訪問權限的Java虛擬機。因此運行的jstatd進程和目標Java虛擬機的用戶認證必須相同,某些用戶認證,例如在基於 UNIX系統下的root用戶,有權限訪問在該系統中的任何Java虛擬機。一個jstatd進程可以監控與其擁有相同用戶認證的系統中的任何Java虛 擬機,當時這也引入了額外的安全問題。
jstatd服務器不為遠程客戶端提供任何認證。因此一個jstatd服務器進程將把所有的Java虛擬機暴露給網絡上擁有訪問權限的用戶的jstatd 進程。這種暴露在你的環境中可能是令人不快的,而且在jstatd進程啟動之前你也應該考慮一下你的本地安全策略,尤其是在生產環境中或者不安全的網絡環 境下。
如果沒有別的安全管理器被安裝的話,jstatd服務器將安裝一個RMISecurityPolicy實例,一次需要制定一個安全策略文件。這個策略文件必須符合策略文件語法的缺省策略實現。
如下的策略文件允許jstatd服務運行而沒有任何安全異常。這個策略比授權給任何代碼庫所有權限的自由度要小,但要比運行jstatd服務所需的最小權限的自由度大一些。
grant codebase "file:${java.home}/../lib/tools.jar" {
permission java.security.AllPermission;
};
為了使用這個策略,拷貝上面的文本到一個名字為jstatd.all.policy的文本文件中,然后使用如下命令運行jstatd服務:
jstatd -J-Djava.security.policy=jstatd.all.policy
(2)在遠程機器上啟動jstatd
(3)在VisualVm中創建jstatd遠程連接
(4)啟動時加入jvm參數,使用jmx方式連接
無限制訪問
set JAVA_OPTS=-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9008 -Dcom.sun.management.jmxremote.authenticate=false - Dcom.sun.management.jmxremote.ssl=false
需要用戶名和密碼訪問
JAVA_OPTS='-Xms128m -Xmx256m -XX:MaxPermSize=128m -Djava.rmi.server.hostname=192.168.1.8
-Dcom.sun.management.jmxremote.port=8088 -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' (jmxremote.access 在JAVA_HOME\jre\lib\management下有模板) jmxremote.access 中顯示 monitorRole readonly controlRole readwrite jmxremote.password中顯示 monitorRole QED (QED為密碼) controlRole R&D
4.其它事項
(1)使用遠程主機監控方式,即jstatd方式時,每次啟動工具時會自動檢測並連接已配置的監控主機,但無法提供遠程主機內存的快照和具體信息,僅可提供cpu和內存的使用監控信息
使用jmx方式連接,如果遠程的java進程重啟,則需要重新建立連接,因為遠程的java進程ID已變化
(2)我在使用該工具時,原本Linux系統中安裝的是openjdk,未能連接成功,改為oracle的HotSpot虛擬機后,可以連接
(3)具體功能圖片如下(來自http://visualvm.java.net/features.html)


參考鏈接:
http://visualvm.java.net/zh_CN/intro.html
http://www.blogjava.net/titanaly/archive/2012/03/20/372318.html