一、jvisualvm監控遠程jvm的兩種連接方式
方式一:JMX
1. 服務端,添加配置
在tomcat/bin/catalina.sh文件中添加如下配置:
export JAVA_OPTS="-Xms256m -Xmx512m -Xss256m -XX:PermSize=512m -XX:MaxPermSize=1024m -Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=10.7.93.127 -Dcom.sun.management.jmxremote.port=9015 -Dcom.sun.management.jmxremote.rmi.port=9015 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"
詳解:
要使用jmx遠程監控功能,在遠程java application啟動時,必須通過jvm選項配置提供遠程服務的端口:
-Dcom.sun.management.jmxremote.port=9015
一般同時指定為本地jmx client提供服務的端口與遠程服務端口相同:
-Dcom.sun.management.jmxremote.rmi.port=9015
jmx遠程服務默認是開啟ssl和認證功能功能的,也可以通過jvm選項把這兩個功能關閉:
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
還可以設置虛擬機參數:
-Xms256m -Xmx512m -Xss256m -XX:PermSize=512m -XX:MaxPermSize=1024m
jmx默認是通過localhost的ip地址提供RMI服務的,如果要明確指定RMI服務地址或主機名(比如主機有多個接口,想使用非hostname關聯的接口),可以通過以下選項顯式指定:
-Djava.rmi.server.hostname=服務器IP
這樣開啟jmx遠程監控功能的最小配置具體如下:
-Xms256m
-Xmx512m
-Xss256m
-XX:PermSize=512m
-XX:MaxPermSize=1024m
-Dcom.sun.management.jmxremote
-Djava.rmi.server.hostname=服務器IP
-Dcom.sun.management.jmxremote.port=9015
-Dcom.sun.management.jmxremote.rmi.port=9015
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
2. 重啟tomcat
<遠程主機名或ip地址>:8777
,或jmx服務地址
service:jmx:rmi:///jndi/rmi://<遠程主機名或ip地址>:8777/jmxrmi
連接遠程java application進行監控了
3. 客戶端操作
3.1.啟動jvisualvm.exe
找到jdk安裝目錄進入bin目錄下, 雙擊 jvisualvm.exe
啟動后的界面
3.2.配置JMX
方式二:JSTATD
1. 創建 XXX.policy文件
.policy
,
grant codebase "file:/usr/java/jdk1.8.0_212/lib/tools.jar" {
permission java.security.AllPermission;
};
或者
grant codebase "file:${java.home}/../lib/tools.jar" {
permission java.security.AllPermission;
};
2. 啟動
./jstatd -J-Djava.security.policy=jstatd-all.policy &
或者指定端口
./jstatd -J-Djava.security.policy=jstatd-all.policy -p 9016 &
3. 客戶端配置
3.1.啟動jvisualvm.exe
找到jdk安裝目錄進入bin目錄下, 雙擊 jvisualvm.exe
啟動后的界面
3.2.配置JMX
3.3.連接jstatd
二、區別和利弊
1. jmx是jvm自身提供的一個標准的jmx管理功能,client支持度非常好,jvm監控工具基本上都會支持這種連接方式。而且只要配置幾個簡單的選項就可以使用了,不需要單獨啟動一個第三方的只用來監控連接的應用程序
2. jstatd是jdk提供的一個單獨的工具,一個主機只需要運行一個jstatd就可以監控主機上所有的java application,而因為jmx是集成在jvm中,如果主機上有多個java應用程序需要監控,需要每個java應用程序配置相應的jmx選項,而且遠程服務端口不能相同,client監控時也需要與每個java應用程序建立單獨的連接
3. java應用程序啟動時如果沒有配置相應的jmx選項,則在運行周期內都無法遠程監控應用程序,這可能會喪失定位問題的機會。而jstatd需要監控時,可以隨時運行並進行監控在jvisualvm中,只有通過jstatd連接才能使用visualGC插件功能
4. jstatd server的端口是隨機選擇的,在有些情況下可能無法使用。比如我司的辦公區域與生產區域之間網絡設置了防火牆,只允許某個范圍的端口通過,這是公司級的,某個團隊無法修改防火牆策略。同時辦公區域也不能直接ssh訪問生產區域服務器,必須經過一個relay,也不能使用jstatd over ssh的方式。個人覺得jstatd不能在啟動時顯示指定服務的端口是它的一個槽點
5. jstatd不支持cpu監控