jstatd,即虛擬機的jstat守護進程,主要用於監控JVM的創建與終止,並提供一個接口允許遠程監控工具依附到在本地主機上運行的JVM。
用法摘要
jstatd [ options ]
-
options - 命令行選項。這些選項可以是任意順序。如果存在多余的或者自相矛盾的選項,則優先考慮最后的選項。
描述
jstatd工具是一個RMI服務器應用程序,主要用於監控HotSpot Java 虛擬機的創建與終止,並提供一個接口以允許遠程監控工具附加到本地主機上運行的JVM上。
jstatd服務器需要在本地主機上存在一個RMI注冊表。jstatd服務器將嘗試在默認端口或-p port選項指定的端口附加到該RMI注冊表上。如果RMI注冊表不存在,jstatd應用程序將會自動創建一個,並綁定到-p port選項指定的端口上,如果省略了-p port選項,則綁定到默認的RMI注冊表端口。你可以通過指定-nr選項來抑制內部RMI注冊表的創建。
注意:此工具是不受支持的,並且無法確定在未來版本的JDK中是否可用。目前,此工具不適用於Windows 98和Windows ME平台。
選項
-nr
當找不到現有的RMI注冊表時,不嘗試使用jstatd進程創建一個內部的RMI注冊表。
-p port
在指定的端口查找RMI注冊表。如果沒有找到,並且沒有指定-nr選項,則在該端口自行創建一個內部的RMI注冊表。
-n rminame
RMI注冊表中綁定的RMI遠程對象的名稱。默認的名稱為JStatRemoteHost。如果多個jstatd服務器在同一主機上運行,你可以通過指定該選項來讓每個服務器導出的RMI對象具有唯一的名稱。不管如何,這樣做需要將唯一的服務器名稱包含進監控客戶端的hostid和vmid字符串中。
-Joption
將選項參數傳遞給被javac調用的java啟動程序。例如,-J-Xms48m設置啟動內存為48 MB。使用-J將選項參數傳遞給執行Java應用程序的底層虛擬機,這是一種常見慣例。
安全性
jstatd只能夠監控具有適當的本地訪問權限的JVM。因此,jstatd進程必須以與目標JVM相同的用戶憑證來運行。某些用戶憑據,例如基於Unix系統的root用戶,有權限訪問系統中任何JVM導出的instrumentation。以此憑據運行的jstatd進程可以監控系統上的任何JVM,但會引入一些額外的安全隱患。
jstatd服務器不提供遠程客戶端的任何授權許可。因此,通過那些jstatd進程有權訪問網絡中任何用戶的所有JVM,運行jstatd進程會暴露instrumentation出口。這種接觸可能不是你的當前環境所想要的;在啟動jstatd進程之前,尤其是和生產環境或者非安全的網絡中,你應該考慮本地的安全策略。
如果沒有安裝其他的安全管理器,jstatd服務器會安裝一個RMISecurityPolicy的實例,因此需要指定一個安全策略文件。策略文件必須遵循該默認策略實現的策略文件語法。
下列策略文件將允許jstatd服務器在沒有任何安全例外的情況下運行。該策略沒有授權所有權限給所有代碼庫那么自由,但卻比授予最小的權限來運行jstatd服務器更自由。
grant codebase "file:${java.home}/../lib/tools.jar" {
permission java.security.AllPermission;
};
為了使用此策略,請復制上述文本到一個名叫jstatd.all.policy的文件中,並使用如下命令運行jstatd服務器:
jstatd -J-Djava.security.policy=jstatd.all.policy
對於具有更嚴格的安全實踐的網絡場所而言,可能使用一個自定義的策略文件來顯示對特定的可信主機或網絡的訪問,盡管這種技術容易受到IP地址欺詐攻擊。 如果你的安全問題無法使用一個定制的策略文件來處理,那么最安全的操作是不運行jstatd服務器,而是在本地使用jstat和jps工具。
遠程接口
jstatd進程輸出的接口是私有的,並會產生變化。不鼓勵用戶和開發者往此接口寫入數據。
示例
這里有一些啟動jstatd的示例。注意,jstatd腳本會自動在后台啟動服務器。
1、使用內部的RMI注冊表
本示例演示啟動jstatd,並使用內部RMI注冊表。本示例假定沒有其它服務器綁定到默認的RMI注冊表端口(端口號 1099)。
jstatd -J-Djava.security.policy=all.policy
2、使用外部的RMI注冊表
本示例演示啟動jstatd,並使用外部RMI注冊表。
rmiregistry & jstatd -J-Djava.security.policy=all.policy
本示例演示啟動jstatd,並使用端口2020上的外部RMI注冊表。
rmiregistry 2020 & jstatd -J-Djava.security.policy=all.policy -p 2020
本示例演示啟動jstatd,並使用端口2020上的外部RMI注冊表,綁定的RMI遠程對象名稱為AlternateJstatdServerName。
rmiregistry 2020 & jstatd -J-Djava.security.policy=all.policy -p 2020 -n AlternateJstatdServerName
3、抑制進程中的RMI注冊表的創建
本示例演示啟動jstatd,而且即使找不到現有的RMI注冊表,也不會創建一個新的RMI注冊表。本示例假定已經有一個RMI注冊表在運行中。如果沒有,則發出適當的錯誤信息。
jstatd -J-Djava.security.policy=all.policy -nr
4、啟動RMI日志能力
本示例演示啟動jstatd,並啟用RMI日志功能。該技術對於故障排除的援助或者監控服務器活動非常有用。
jstatd -J-Djava.security.policy=all.policy -J-Djava.rmi.server.logCalls=true
5、遠程連接實例
在JDK的bin目錄下新建jstatd.all.policy文件(其實目錄可以自己選擇)鍵入一下代碼用於啟動JSTATD:
vim jstatd.all.policy #內容如下 grant codebase "file:${java.home}/../lib/tools.jar" { permission java.security.AllPermission; };
啟動
jstatd -J-Djava.security.policy=/opt/jstatd.all.policy(文件的目錄/jstatd.all.policy) -p 123(端口號,用於Java VisualVM遠程鏈接)
使用VisualVM進行遠程連接,在JAVA_HOME/bin下找到jvisualvm,啟動輸入遠程IP+端口號即可。
參考:
http://www.softown.cn/post/188.html(以上內容轉自此篇文章)
