文前说明
作为码农中的一员,需要不断的学习,我工作之余将一些分析总结和学习笔记写成博客与大家一起交流,也希望采用这种方式记录自己的学习之旅。
本文仅供学习交流使用,侵权必删。
不用于商业目的,转载请注明出处。
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 命令显示主类的功能才能进行区分。
- 可以通过 -J 方式,将虚拟机参数传递给 jps 调用的启动程序。例如 -J-Xms48m。
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。通过解析每个文件,就可以获得系统的参数等。
网友评论