Java工具之JPS

JPS使用

 

 

熟悉Linux的朋友们都知道,Linux下有一个常用的命令叫做psProcess Status),是用来查看Linux环境下进程信息的。同样的,在Java Virtual Machine里面也提供了类似的工具供广大Java开发人员使用,它就是jpsJava Process Status),它可以用来显示正在运行的虚拟机进程。

 

显示的信息主要包括两项,一个是虚拟机的执行子类,另一个是这些进程的本地虚拟机唯一IDLocal Virtual Machine Identifier, LVMID)。Jps的功能可以说是十分单一,但是它可以说是最常用的工具之一了,因为其它都需要用到它查询出来的LVMID来确定监控的是哪一个虚拟机进程。

 

有些人可能会问既然Linux下面的ls可以查询到进程了,为什么还要这个jps工具呢?如果只运行一个虚拟机进程的时候,ls当然是十分有效的。但是运行多个虚拟机进程,且这些进程不可以通过名称来分别的时候,就需要使用虚拟机的执行主类名来进行区分了,所以jps还是很有必要的。

 

Jps命令的格式:

Jps [ options ] [ hostid ]

 

Jps执行样例:

F:\ProgromFiles\Java\JDK\bin>jps -l

5008 sun.tools.jps.Jps

 

Jps可以通过RMI协议来查询开启了RMI服务的远程虚拟机进程状态,hostid就是RMI注册表中注册的主机名。

Jps命令的常用选项表如下:

-q    只输出LVMID,省略执行主类名

-m   输出进程启动时,传给执行主类main()函数的参数

-l    输出主类的全名,如果进行执行的是jar,输出jar路径

-v    输出虚拟机进行启动时的JVM参数

 

使用命令的时的常见问题:

<!--[if !supportLists]-->1.执行jps命令后没有任何输出?

分析:java程序启动后,默认(请注意是默认)会在/tmp/hsperfdata_userName目录下以该进程的id为文件名新建文件,并在该文件中存储jvm运行的相关信息,其中的userName为当前的用户名,/tmp/hsperfdata_userName目录会存放该用户所有已经启动的java进程信息。对于windows机器/tmpWindows存放临时文件目录代替。

原因:(1)无文件读写权限,请确认运行该命令用户的权限。(2)检查相应目录下文件是否存在。

 

<think>我们要求的是在Java中如何裁剪(过滤)jps命令的输出。jps是JDK提供的一个工具,用于列出当前用户的Java进程。但有时我们可能只需要特定名称的进程,或者需要排除某些进程,这就需要“裁剪”输出。 注意:jps命令本身并不提供过滤功能,所以通常我们需要结合其他命令(如grep)来实现。但在Java程序中,我们可以通过运行jps命令并解析其输出来实现裁剪。 以下是一个Java程序示例,它执行jps命令并过滤输出,只显示包含特定字符串的进程(例如,只显示进程名包含"Main"的进程)。 步骤: 1. 使用Runtime.getRuntime().exec()执行jps命令。 2. 读取命令的输出流。 3. 按行处理输出,每一行通常由进程ID和进程名称组成。 4. 根据进程名称进行过滤(这里我们使用简单的字符串包含匹配)。 5. 打印过滤后的结果。 注意:jps命令的输出格式是:<pid> [<options>] <main class or jar> [<args>] 代码示例:</think>在 Java 中,"裁剪 jps" 通常指过滤或精简 `jps` 命令的输出结果。`jps`(Java Virtual Machine Process Status Tool)是 JDK 自带的工具,用于列出当前系统的 Java 进程信息。以下是几种常见的裁剪/过滤方法: --- ### 方法 1:使用命令行管道(Linux/Mac/WSL) 通过管道结合 `grep`/`findstr` 过滤进程名: ```bash # Linux/Mac/WSL jps -l | grep "MyApp" # Windows jps -l | findstr "MyApp" ``` --- ### 方法 2:Java 程序调用 jps 并过滤(跨平台) 通过 Java 程序执行 `jps` 并解析输出: ```java import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; public class JpsFilter { public static void main(String[] args) { // 目标进程名(支持部分匹配) String targetProcess = "MyApp"; try { // 执行 jps -l 获取完整类名 Process process = Runtime.getRuntime().exec("jps -l"); BufferedReader reader = new BufferedReader( new InputStreamReader(process.getInputStream()) ); // 读取并过滤输出 List<String> filtered = new ArrayList<>(); String line; while ((line = reader.readLine()) != null) { if (line.contains(targetProcess)) { filtered.add(line); } } // 打印结果 if (filtered.isEmpty()) { System.out.println("No matching Java processes found."); } else { filtered.forEach(System.out::println); } } catch (Exception e) { e.printStackTrace(); } } } ``` **代码说明**: 1. 使用 `jps -l` 获取完整的类名/路径 2. 逐行检查输出是否包含目标字符串(支持部分匹配) 3. 打印过滤后的进程信息(格式:`PID 完整类名`) --- ### 方法 3:使用 `jcmd` 精确过滤(推荐) JDK 的 `jcmd` 工具支持更灵活的进程过滤: ```bash # 列出所有包含 "MyApp" 的进程 jcmd -l | grep "MyApp" # 示例输出:12345 com.example.MyApp ``` --- ### 输出示例 假设原始 `jps -l` 输出: ``` 25645 sun.tools.jps.Jps 12346 com.example.MyApp 7890 org.jetbrains.idea.Main ``` 过滤后(`MyApp`): ``` 12346 com.example.MyApp ``` --- ### 注意事项 1. **权限问题**:确保有权限访问目标 Java 进程(如 Linux 的 `sudo`) 2. **跨平台**:方法 2 的 Java 代码可在所有平台运行 3. **精确匹配**:若需精确匹配,可将 `contains()` 改为正则或全等匹配
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值