前言
最近一個項目部署在服務器上運行時出現了問題,經過排查發現是java內存溢出的問題,所以為了實時監控服務器java內存的情況,需要遠程查看服務器上JVM內存的一些情況。另外服務器系統是CentOS 7 最小安裝,沒有圖形化界面,不能采用vnc遠程。所以只能通過VisualVM或者JConsole來遠程JVM。
環境介紹
1. 服務器:CentOS 7(最小安裝) ip:192.168.22.249(示例) jdk:1.8
2. 客戶端:Windows jdk:1.8
介紹兩個jdk1.8自帶的可視化監視工具
Jconsole:
Java 6.x采用JMX方式提供了一系列監視和管理虛擬機的API,隨SDK一起發布的JConsole則是采用這些API實現監控虛擬機的使用工具。 JConsole能夠提供被監控虛擬機的內存、線程、類的加載以及MBean等信息,從而能夠對服務器的運行情況進行實時監控。
JVisualVM:
是Netbeans的profile子項目,已在JDK6.0 update 7 中自帶(java啟動時不需要特定參數,監控工具在bin/jvisualvm.exe),能夠監控線程,內存情況,查看方法的CPU時間和內存中的對 象,已被GC的對象,反向查看分配的堆棧(如100個String對象分別由哪幾個對象分配出來的)。
VisualVM和JConsole在監控本地JVM的時候是很方便的。只要應用程序運行起來,我們就可以連接上本地JVM,從VisualVM里面監控JVM的情況。
遠程服務器上的JVM監控就需要一些額外的配置。目前VisualVM支持兩種監控方法:Jstatd方法和基於JMX的方法。
這篇博客我們先介紹Jstatd方法
jstatd是一個rmi的server應用,用於監控jvm的創建和結束,並且提供接口讓監控工具可以遠程連接到本機的jvm 。jstatd位於 $JAVA_HOME/bin目錄下,具體使用方法如下:
1,啟動RMI服務
在需要被監控的服務器上面,通過jstatd來啟動RMI服務
首先,配置java安全訪問,在服務器jdk路徑(/java_home/bin)下新建文件
名稱: jstatd.all.policy
內容:
grant codebase "file:${java.home}/../lib/tools.jar" { permission java.security.AllPermission; };
然后在進入jstatd.all.policy所在目錄下,通過如下的命令啟動RMI服務:
./jstatd -J-Djava.security.policy=jstatd.all.policy
或者
./jstatd -J-Djava.security.policy=jstatd.all.policy -J-Djava.rmi.server.hostname=192.168.22.249

2.啟動客戶端的VisualVM,添加遠程主機

VisualVM 在/java_home/bin目錄下
連接后會自動加載出服務器JVM運行情況。


在Jstatd監控方式下,JConsole是不能啟用的,因為JConsole登錄需要端口號。
另外我們還可以為VisualVM安裝一些插件,比如GC,MBeans等等。滿足自己的需要。下一篇博客講解以JVM方式實現遠程監控。