1.交流:JStatD與JMX
VisualVM和JVM之間有兩種通信方式:通過Java Management Extensions (JMX)協議或通過jstatd 。
jstatd
jstatd是與JDK一起分發的守護程序。 在目標計算機上從命令行啟動它(可能需要以運行目標JVM的用戶身份或以root用戶身份運行它),VisualVM將與它聯系以獲取有關遠程JVM的信息。
- 優點:可以連接到正在運行的JVM,無需使用特殊參數啟動它
- 缺點:監視功能受到更多限制(例如,沒有CPU使用率監視,無法運行Sampler和/或進行線程轉儲)。
例如:
bash> cat jstatd.all.policy
grant codebase 'file:${java.home}/../lib/tools.jar' {
permission java.security.AllPermission;
}
bash> sudo /path/to/JDK/bin/jstatd -J-Djava.security.policy=jstatd.all.policy
# You can specify port with -p number and get more info with -J-Djava.rmi.server.logCalls=true
注意:如果僅復制但未安裝JDK,則將“ $ {java.home} /../ lib / tools.jar”替換為絕對的“ /path/to/jdk/lib/tools.jar”。
如果失敗了
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:374)
那么jstatd可能沒有使用正確的java.security.policy文件啟動(嘗試提供其完全限定的路徑)。
有關來自Oracle的VisualVM和jstatd的更多信息 。
JMX
- 優點:使用JMX將為您提供VisualVM的全部功能。
- 缺點:需要使用某些系統屬性啟動JVM。
啟動目標JVM時,通常將需要使用以下屬性(盡管您也可以啟用SSL和/或要求用戶名和密碼):
yourJavaCommand... -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.port=1098
請參閱遠程JMX連接 。
2.安全性:SSH
通過ssh連接到遠程JMX或jstatd的最簡單方法是使用SOCKS代理 ,它可以設置標準ssh客戶端。
2.1使用SOCKS設置SSH隧道
ssh -v -D 9696 my_server.example.com
2.2配置VisualVM以使用代理
工具->選項->網絡–手動代理設置–檢查它并在本地主機和端口9696上配置SOCKS代理
2.3將VisualVM連接到目標
文件->添加遠程主機…–鍵入遠程計算機的IP或主機名JStatD連接
您應該在ssh窗口中都看到日志(由于其“ -v”, 例如: “ debug1:端口9696的連接轉發到請求的socks端口0。 ”和“ debug1:通道3:free:direct-tcpip:為10.2.47.71端口1099偵聽端口9696,從127.0.0.1端口61262,nchannels 6 “” 連接并在啟動jstatd的控制臺中(很多,例如“ FINER:RMI TCP Connection(23)-10.2.47.71 :… “)
添加遠程主機后,請等待幾分鐘,然后您將看到JVM在其中運行。
可用狀態:JVM參數,監視器:堆,類,線程監視(但不包括CPU)。 采樣器和MBean需要JMX。
JMX
右鍵單擊已添加的遠程主機,然后選擇“添加JMX連接...”,鍵入您選擇的JMX端口。
您應該看到與jstatd類似的日志。
可用的統計信息:CPU使用率,系統屬性,詳細的線程報告(可訪問堆棧跟蹤),CPU采樣(不支持內存采樣)。
注意:采樣器與分析器
VisualVM的采樣器不包括在Object.wait和Thread.sleep(例如,等待I / O)中花費的時間。 如果您希望獲得更多控制權或希望包括Object.wait和Thread.sleep時間,請使用NetBeans Profiler來對遠程應用程序進行概要分析或采樣。 它要求其Remote Pack(Java代理,即JAR文件)位于目標JVM中(NetBeans的附加向導可以在步驟4(手動集成)中為您生成遠程包,并向您展示傳遞給目標的選項JVM使用它)。
您可以通過以下方式通過SSH運行探查器:轉發其默認端口 (5140),并將其附加到本地主機上的轉發端口(NetBeans版本7.1.1)。
別忘了分享!
參考: VisualVM: The Holy Java博客上來自JCG合作伙伴 Jakub Holy的通過SSH監視遠程JVM(無論是否為JMX) 。
翻譯自: https://www.javacodegeeks.com/2012/09/visualvm-monitoring-remote-jvm-over-ssh.html