今天有同事說使用
jvisualvm
通過JMX方式連接到遠程應用時括荡,Visual GC插件提示“Not supported for this JVM”畸冲,無法顯示堆內(nèi)存各區(qū)的使用情況观腊。在此簡單介紹一下遠程監(jiān)控的方法梧油。
使用JMX連接到遠程JVM
通常情況下,JVisualVM可以像JConsole一樣褪子,通過JMX的方式連接到遠程服務器上的JVM褐筛,此時能獲取到JVM的基本信息(啟動參數(shù)叙身、系統(tǒng)屬性)、CPU使用情況晃痴、堆內(nèi)存整體情況以及線程的整體情況等倘核。但如果想通過Visual GC插件進一步了解堆內(nèi)各區(qū)的情況的話,就會發(fā)現(xiàn)插件此時并不工作活尊。如下各圖蛹锰,使用JMX連接到遠程服務器上的Demo1應用:
Visual GC插件不工作转捕,是因為此插件使用的協(xié)議是RMI五芝,因此需要使用下面的jstatd方式進行連接辕万。
使用JStatD連接到遠程JVM
JVM jstat Daemon:守護進程渐尿,一個RMI(Remote Method Invocation)服務器程序,用于監(jiān)控本地所有JVM從創(chuàng)建開始直到銷毀整個過程中的資源使用情況隘擎,同時提供接口給監(jiān)控工具(如這里的VisualVM)凉夯,讓工具能連接到本機所有的JVM。
啟動jstatd server application需要使用與啟動那些JVM相同的用戶休傍,或者root蹲姐。即當前用戶運行jstatd
監(jiān)控到的是當前用戶運行的所有JVM柴墩。
由于jstatd server沒有提供任何對遠程client端的認證,客戶端程序獲取到本地當前用戶的所有JVM信息后可能存在安全隱患慰毅,所以jstatd要求啟動之前必須指定本地安全策略扎阶,否則jstatd進程無法啟動东臀,拋出如下錯誤:
Could not create remote object
access denied ("java.util.PropertyPermission" "java.rmi.server.ignoreSubClasses" "write")
java.security.AccessControlException: access denied ("java.util.PropertyPermission" "java.rmi.server.ignoreSubClasses" "write")
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:472)
at java.security.AccessController.checkPermission(AccessController.java:884)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
at java.lang.System.setProperty(System.java:792)
at sun.tools.jstatd.Jstatd.main(Jstatd.java:139)
為了解決以上錯誤惰赋,在本地(實際是需要被監(jiān)控的遠程主機,對應我們示例中的marslnx1v)創(chuàng)建一個安全策略文件轨奄,比如保存為/home/dereck/jstatd-all.policy
拒炎,內(nèi)容如下:
grant codebase "file:${java.home}/../lib/tools.jar" {
permission java.security.AllPermission;
};
然后通過如下命令可以成功啟動jstatd server
[dereck@marslnx1v ~] jstatd -J-Djava.security.policy=/home/dereck/jstatd-all.policy
-Joption
向通過jstatd命令啟動的JVM(Main class:sun.tools.jstatd.Jstatd)傳遞參數(shù)击你,比如-J-Xms48m指定了Jstatd這個JVM的初始堆內(nèi)存為48MB
此時在客戶端啟動JVisualVM,對應的遠程主機節(jié)點下會自動列出所有運行的JVM
JMX連接與JStatD連接方式的區(qū)別
- JMX
- 使用JMX需要遠程JVM在啟動的時候開啟遠程訪問支持,設定JMX端口等石景,示例參數(shù)如下
java demo.Demo1 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=10011 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false
- 每一個JMX連接一個遠程JVM
- 使用JMX需要遠程JVM在啟動的時候開啟遠程訪問支持,設定JMX端口等石景,示例參數(shù)如下
- JStatD
- 使用jstatd連接方式時鸵钝,需要在遠程主機上創(chuàng)建安全策略文件然后啟動jstatd進程,并且此進程需要一直保持運行狀態(tài)
- 客戶端可以看到遠程主機上當前用戶的所有JVM的信息变逃,即只要創(chuàng)建一個jstatd連接
參考