公司線上項目出現了java heap space 而後通過查詢知曉了下面工具因而開始了嘗試。java
visualvm能幹什麼:監控內存泄露,跟蹤垃圾回收,執行時內存、cpu分析,線程分析...linux
jvisualvm已經被集成在jdk1.6以上的版本中(不是jre)。自身運行須要最低jdk1.6版本,可是能夠監控運行在jdk1.4以上版本的java程序tomcat
以jdk1.6update45(jdk1.6update45自帶的jvisualvm)來作說明,固然也可單獨下載獨立的jvisualvm,正常安裝完jdk後,至jdk的bin目錄下,運行jvisualvm.exe便可安全
網上有人說jvisualvm對ntfs的硬盤格式支持的很差(都說很差,也沒說到底哪裏很差),反正我用着是挺正常的,無論怎麼樣先把解決方式記下來吧服務器
建立jvisualvm.exe的快捷方式,右鍵快捷方式選擇屬性,在「目標」欄中追加"-XX:+PerfBypassFileSystemCheck"多線程
程序運行後會自動監控本機運行的java程序(Local標籤下,遠程服務器上的java程序須要另行配置),若是是下載的jvisualvm,解壓後,運行bin目錄下的jvisualvm.exe便可eclipse
Local標籤下的第一個VisualVM爲jvisualvm對自身的監控,能夠看到消耗的資源仍是不多的,第二個爲本機的eclipsejvm
監控項總共分爲Overview,Monitor,Threads和一個Sampler。工具
1.Overview(jvm啓動參數,系統參數)測試
能夠看到eclipse的啓動參數
(經過這些啓動參數,能夠判斷程序是否有內存溢出)
2.Monitor
左上:cpu利用率,gc狀態的監控
右上:堆利用率,永久內存區的利用率
左下:類的監控
右下:線程的監控
performGC:gc的詳細運行狀態
HeapDump:堆的詳細狀態(能夠看到堆的概況,裏面全部的類,還能點進具體的一個類查看這個類的狀態)
3.Threads
可以顯示線程的名稱和運行的狀態,在調試多線程時必不可少,並且能夠點進一個線程查看這個線程的詳細運行狀況
監控服務器上的tomcat
tomcat的配置文件catalina.sh中增長:
JAVA_OPTS="-Dcom.sun.management.jmxremote.port=9998 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=192.168.58.164"
參數說明:
指定了JMX啓動的代理端口,這個端口就是visualvm要鏈接的端口(9998端口不能被別的程序使用netstat -an|gerp 9998) Dcom.sun.management.jmxremote.port=9998 指定了JMX是否啓用ssl Dcom.sun.management.jmxremote.authenticate=false 指定了JMX是否啓用鑑權(須要用戶名,密碼鑑權) Dcom.sun.management.jmxremote.authenticate=false 指定了服務器主機名 Djava.rmi.server.hostname=192.168.58.164
填寫主機名:
右鍵建立一個jmx鏈接:
填寫上端口號便可:
配置完成:
監控服務器上的java程序
相較於監控tomcat要麻煩不少,要預先啓動jstatd服務(${java_home}/bin目錄下)
jstatd是一個監控JVM從建立到銷燬過程當中資源佔用狀況並提供遠程監控接口的RMI(Remote Method Invocation,遠程方法調用)服務器程序,它是一個Daemon程序(後臺進程),要保證遠程監控軟件鏈接到本地的話須要jstatd始終保持運行。
jstatd運行須要經過-J-Djava.security.policy=***指定安全策略,所以咱們須要在服務器上創建一個指定安全策略的文件jstatd.all.policy(我放在了${java_home}/bin目錄下),文件內容以下:
grant codebase "file:/home/123/123/jdk1.5.0_15/lib/tools.jar" { permission java.security.AllPermission; };
線上項目採用
grant codebase "file:${java.home}/../lib/tools.jar" {
permission java.security.AllPermission;
};
而後使用這個策略文件啓動jstatd服務
[123@123 bin]$ pwd /home/123/123/jdk1.5.0_15/bin [123@123 bin]$ ./jstatd -J-Djava.security.policy=./jstatd.all.policy &
由於監控的過程當中須要jstatd服務一直運行,因此加上了&,若是須要日誌也可以使用:
./jstatd -J-Djava.security.policy=./jstatd.all.policy -J-Djava.rmi.server.logCalls=true
接下來就能夠在jvisualvm中配置監控該服務器上運行的java程序了,和在jvisualvm中配置監控tomcat服務器的操做過程是同樣的
須要特別注意的是,有時在配置遠程監控java程序的時候jvisualvm會報一個錯誤
點擊查看錯誤詳情:
connection refused to host:127.0.0.1初步判斷和主機名有關係
[123@123 bin]# hostname -i 127.0.0.1
[123@123 bin]# hostname 192.168.58.168
修改完重啓jstatd服務(網上不少人說要修改主機的/etc/hosts文件,可是我本身測試修改/etc/hosts文件是沒有效果的,必需要修改主機名)
在鏈接以前 查了下可能還須要如下步驟:修改jmx遠程訪問受權。默認爲JAVA_HOME/jre/lib/management下jmxremote.access、jmxremote.password(缺省系統提供了個模版jmxremote.password.template改下名就成)
注意:linux下須要該權限,chmod 600 jmxremote.access, chmod 600 jmxremote.password
填寫主機名:
這裏要選添加一個jstatd鏈接:
直接選擇默認配置便可(默認使用1099端口):
點擊ok後,168上的全部java程序就會自動列出:
PS:
jvisualvm也是能夠安裝插件的,具體步驟爲tool -> plugin ->aviable plugin,推薦一個很是好用的插件VisualGC
安裝完這個插件後,將會增長新的監控條目Visual GC,能夠看到虛擬機內存各個區的使用狀況
https://my.oschina.net/xuqiang/blog/294613