【Java 虛擬機器筆記】jps 虛擬機器程序狀況工具相關整理
文前說明
作為碼農中的一員,需要不斷的學習,我工作之餘將一些分析總結和學習筆記寫成部落格與大家一起交流,也希望採用這種方式記錄自己的學習之旅。
本文僅供學習交流使用,侵權必刪。
不用於商業目的,轉載請註明出處。
1. 虛擬機器程序狀況工具(JVM Process Status Tool)
-
jps 功能與 ps 命令類似,可以列出正在執行的虛擬機器程序
,並顯示虛擬機器執行主類名稱
以及這些程序的本地虛擬機器唯一 ID
(Local Virtual Machine Identifer,LVMID
)
- 是使用頻率最高的 JDK 命令列工具,因為其他的工具大多需要 LVMID 確定監控的虛擬機器程序。
- 該工具僅限於報告其具有訪問許可權 的虛擬機器程序的資訊。
- LVMID 通常與作業系統的程序 ID(Process Identifer,PID)一致(但也不一定一致),使用 Windows 的工作管理員或者 UNIX 的 ps 命令都可以查詢到虛擬機器程序的 LVMID,但是如果同時啟動多個虛擬機器程序,就需要 jps 命令顯示主類的功能才能進行區分。
1.1 命令格式
-
jps [ options ] [ hostid ]
- options 是命令列選項 。
-
hostid 是為其生成程序報告的主機的主機識別符號
,是一個指示目標系統的字串。
- hostid 可以包括指示通訊協議、埠號和其他具體實施資料。
-
hostid 字串的語法在很大程度上與 URI 的語法相對應。
-
[protocol:][[//]hostname][:port][/servername]
- protocol 是通訊協議 。果省略了協議而未指定主機名,則預設協議是特定於平臺、優化的本地協議。如果省略協議並指定主機名,則預設協議為 RMI。
- hostname 表示目標主機的主機名或 IP 地址 。如果省略了主機名,那麼目標主機就是本地主機。
- port 表示與遠端伺服器通訊的預設埠 。如果省略主機名或協議指定了優化的本地協議,則忽略埠。否則,處理埠引數是特定於實現的。對於預設的 RMI 協議,埠指示遠端主機上 RMIRegistry 的埠號。如果省略埠和協議指示 RMI,然後使用預設的 RMIRegistry 埠(1099)。
- servername 此引數的處理取決於實現。對於優化的本地協議,此欄位將被忽略。對於 RMI 協議,此引數是表示遠端主機上的 RMI 遠端物件的名稱 。
-
[protocol:][[//]hostname][:port][/servername]
- 不指定的情況下執行 jps,將在本地主機 上查詢虛擬機器程序。
選項 | 說明 |
---|---|
-q | 只生成本地虛擬機器識別符號列表。 |
-m | 輸出傳遞給主方法(main 函式)的引數。對於嵌入的虛擬機器輸出可能為空。 |
-l | 輸出應用程式主類的完整包名或應用程式 jar 檔案的完整路徑名。 |
-v | 輸出傳遞給 Java 虛擬機器的引數。 |
-V | 輸出通過 flags 檔案(.hotsoptrc 檔案或 -xx:flags=<filename> 引數指定的檔案)傳遞給 Java 虛擬機器的引數。 |
1.2 執行樣例
[root@localhost ~]# sudo -u ovirt jps -mlvV 28823 /usr/share/jbossas/jboss-modules.jar -mp /var/lib/ovirt-engine/jboss_runtime/modules/00-ovirt-engine-modules:/var/lib/ovirt-engine/jboss_runtime/modules/01-jbossas-modules -jaxpmodule javax.xml.jaxp-provider org.jboss.as.standalone -c ovirt-engine.xml -XX:+TieredCompilation -Xms1g -Xmx1g -XX:PermSize=256m -XX:MaxPermSize=256m -Djava.net.preferIPv4Stack=true -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000 -Djava.awt.headless=true -Djsse.enableSNIExtension=false -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/log/ovirt-engine/dump -Djava.util.logging.manager=org.jboss.logmanager -Dlogging.configuration=file:///var/lib/ovirt-engine/jboss_runtime/config/ovirt-engine-logging.properties -Dorg.jboss.resolver.warning=true -Djboss.modules.system.pkgs=org.jboss.byteman -Djboss.modules.write-indexes=false -Djboss.server.default.config=ovirt-engine -Djboss.home.dir=/usr/share/jbossas -Djboss.server.base.dir=/usr/share/ovirt-engine -Djboss.server.data.dir=/var/lib/ovirt-engine -Djboss.server.log.dir=/var/log/ovirt-engine -Djboss.server.config.dir=/var/lib/ovirt-engine/jboss_runtime/config -Djboss.server.temp.dir=/var/lib/ovirt-engine/jboss_runtime/tmp -Djboss.controller.temp.dir=/var/lib/ovirt-engine/jboss_runtime/tmp
1.3 輸出格式
-
lvmid [ [ classname | JARfilename | "Unknown"] [ arg* ] [ jvmarg* ] ]
- 建議不要編寫指令碼來解析 jps 輸出,因為在將來的版本中格式可能會改變。
1.4 實現機制
-
Java 程式啟動,在
java.io.tmpdir
指定的目錄(臨時資料夾)裡,生成一個類似於 hsperfdata_User 的資料夾,這個資料夾裡(在 Linux 中為 /tmp/hsperfdata_{userName}/)有一些檔案,這些檔案的名字就是 Java 程序的 pid。通過解析每個檔案,就可以獲得系統的引數等。