Java命令学习系列(一)——Jps

本文详细介绍了Java命令Jps的功能及使用方法,包括显示当前Java进程ID、传递给main方法的参数、应用程序完整包名等,并探讨了JPS失效的情况及解决办法。

Java命令学习系列(一)——Jps

jps位于jdk的bin目录下,其作用是显示当前系统的java进程情况,及其id号。 jps相当于Solaris进程工具ps。不象”pgrep java”或”ps -ef grep java”,jps并不使用应用程序名来查找JVM实例。因此,它查找所有的Java应用程序,包括即使没有使用java执行体的那种(例如,定制的启动 器)。另外,jps仅查找当前用户的Java进程,而不是当前系统中的所有进程。

 

位置

我们知道,很多Java命令都在jdk的JAVA_HOME/bin/目录下面,jps也不例外,他就在bin目录下,所以,他是java自带的一个命令。

功能

jps(Java Virtual Machine Process Status Tool)是JDK 1.5提供的一个显示当前所有java进程pid的命令,简单实用,非常适合在linux/unix平台上简单察看当前java进程的一些简单情况。

原理

jdk中的jps命令可以显示当前运行的java进程以及相关参数,它的实现机制如下: java程序在启动以后,会在java.io.tmpdir指定的目录下,就是临时文件夹里,生成一个类似于hsperfdata_User的文件夹,这个文件夹里(在Linux中为/tmp/hsperfdata_{userName}/),有几个文件,名字就是java进程的pid,因此列出当前运行的java进程,只是把这个目录里的文件名列一下而已。 至于系统的参数什么,就可以解析这几个文件获得。

hollis@hos:/tmp/hsperfdata_hollis$ pwd /tmp/hsperfdata_hollis hollis@hos:/tmp/hsperfdata_hollis$ ll total 48 drwxr-xr-x 2 hollis hollis 4096 4 16 10:54 ./ drwxrwxrwt 7 root root 12288 4 16 10:56 ../ -rw------- 1 hollis hollis 32768 4 16 10:57 2679 hollis@hos:/tmp/hsperfdata_hollis$ 

上面的内容就是我机器中/tmp/hsperfdata_hollis目录下的内容,其中2679就是我机器上当前运行中的java的进程的pid,我们执行jps验证一下:

hollis@hos:/tmp/hsperfdata_hollis$ jps 2679 org.eclipse.equinox.launcher_1.3.0.v20130327-1440.jar 4445 Jps

执行了jps命令之后,我们发现有两个java进程,一个是pid为2679的eclipse运行的进程,另外一个是pid为4445的jps使用的进程(他也是java命令,也要开一个进程)

使用

想要学习一个命令,先来看看帮助,使用jps -help查看帮助:

hollis@hos:/tmp/hsperfdata_hollis$ jps -help usage: jps [-help] jps [-q] [-mlvV] [<hostid>] Definitions: <hostid>: <hostname>[:<port>]

接下来,为了详细介绍这些参数,我们编写几个类,在main方法里写一个while(true)的循环,查看java进程情况。代码如下:

package com.JavaCommand; /** * @author hollis */ public class JpsDemo { public static void main(String[] args) { while(true){ System.out.println(1); } } }

-q 只显示pid,不显示class名称,jar文件名和传递给main 方法的参数

hollis@hos:/tmp/hsperfdata_hollis$ jps -q 2679 11421

-m 输出传递给main 方法的参数,在嵌入式jvm上可能是null, 在这里,在启动main方法的时候,我给String[] args传递两个参数。hollis,chuang,执行jsp -m:

hollis@hos:/tmp/hsperfdata_hollis$ jps -m 12062 JpsDemo hollis,chuang

-l 输出应用程序main class的完整package名 或者 应用程序的jar文件完整路径名

hollis@hos:/tmp/hsperfdata_hollis$ jps -l 12356 sun.tools.jps.Jps 2679 /home/hollis/tools/eclipse//plugins/org.eclipse.equinox.launcher_1.3.0.v20130327-1440.jar 12329 com.JavaCommand.JpsDemo

-v 输出传递给JVM的参数 在这里,在启动main方法的时候,我给jvm传递一个参数:-Dfile.encoding=UTF-8,执行jps -v

hollis@hos:/tmp/hsperfdata_hollis$ jps -v 2679 org.eclipse.equinox.launcher_1.3.0.v20130327-1440.jar -Djava.library.path=/usr/lib/jni:/usr/lib/x86_64-linux-gnu/jni -Dosgi.requiredJavaVersion=1.6 -XX:MaxPermSize=256m -Xms40m -Xmx512m 13157 Jps -Denv.class.path=/home/hollis/tools/java/jdk1.7.0_71/lib:/home/hollis/tools/java/jdk1.7.0_71/jre/lib: -Dapplication.home=/home/hollis/tools/java/jdk1.7.0_71 -Xms8m 13083 JpsDemo -Dfile.encoding=UTF-8

PS:jps命令有个地方很不好,似乎只能显示当前用户的java进程,要显示其他用户的还是只能用unix/linux的ps命令。

JPS失效处理

现象: 用ps -ef|grep java能看到启动的java进程,但是用jps查看却不存在该进程的id。待会儿解释过之后就能知道在该情况下,jconsole、jvisualvm可能无法监控该进程,其他java自带工具也可能无法使用

分析: jps、jconsole、jvisualvm等工具的数据来源就是这个文件(/tmp/hsperfdata_userName/pid)。所以当该文件不存在或是无法读取时就会出现jps无法查看该进程号,jconsole无法监控等问题

原因:

(1)、磁盘读写、目录权限问题 若该用户没有权限写/tmp目录或是磁盘已满,则无法创建/tmp/hsperfdata_userName/pid文件。或该文件已经生成,但用户没有读权限

(2)、临时文件丢失,被删除或是定期清理 对于linux机器,一般都会存在定时任务对临时文件夹进行清理,导致/tmp目录被清空。这也是我第一次碰到该现象的原因。常用的可能定时删除临时目录的工具为crontab、redhat的tmpwatch、ubuntu的tmpreaper等等

这个导致的现象可能会是这样,用jconsole监控进程,发现在某一时段后进程仍然存在,但是却没有监控信息了。

(3)、java进程信息文件存储地址被设置,不在/tmp目录下 上面我们在介绍时说默认会在/tmp/hsperfdata_userName目录保存进程信息,但由于以上1、2所述原因,可能导致该文件无法生成或是丢失,所以java启动时提供了参数(-Djava.io.tmpdir),可以对这个文件的位置进行设置,而jps、jconsole都只会从/tmp目录读取,而无法从设置后的目录读物信息,这是我第二次碰到该现象的原因

附:

1.如何给main传递参数 在eclipse中,鼠标右键->Run As->Run COnfiguations->Arguments->在Program arguments中写下要传的参数值

1.如何给JVM传递参数 在eclipse中,鼠标右键->Run As->Run COnfiguations->Arguments->在VM arguments中写下要传的参数值(一般以-D开头)

 

转载博客,以作后续学习,转载地址:http://www.hollischuang.com/archives/105

<think> 嗯,用户遇到了安装JDK后找不到jps命令的问题,这确实是Java环境配置的常见痛点。从引用材料看,用户已经收集到两条关键线索:环境变量未生效和OpenJDK开发包缺失。 用户可能是个刚接触Linux的开发者,正急着用jps监控Java进程却被卡住,语气里透着焦虑。ta能准确提供引用资料,说明已经做过功课但还没解决,需要更落地的指导。深层需求其实是“快速恢复工作”,而不仅是解决jps问题。 第条引用提到source /etc/profile后仍要重连SSH,这点很关键——很多教程会漏掉重连步骤。第二条引用则指向更本质的OpenJDK开发包问题,特别是自带的openjdk-devel缺失。需要把这两点结合起来给方案。 先考虑最普遍的情况:用户通过SSH操作远程服务器,可能没权限修改全局环境变量。所以方案要区分全局配置和个人配置。jps属于开发工具,通常包含在jdk/lib下的tools.jar里,但OpenJDK精简版会拆包安装,这就是引用2提到的openjdk-devel的作用。 解决方案要分层处理:先检查环境变量是否包含$JAVA_HOME/bin,再验证开发包完整性。对于权限不足的用户,可以教ta用find命令定位现有JDK位置,避免硬编码路径。引用1提到的重连SSH容易被忽略,要特别强调。 用户可能不知道alternatives配置工具的存在,可以补充这个系统级解决方案。最后提醒jps依赖的tools.jar位置,方便ta后续排查其他命令缺失问题。 </think>以下是安装JDK后找不到 `jps` 命令的原因及解决方案,按优先级排序: --- ### **原因分析** 1. **环境变量未生效** - `jps` 位于 `$JAVA_HOME/bin` 目录下,若未将 `$JAVA_HOME/bin` 加入 `PATH`,或配置后未刷新环境变量,系统无法识别命令。 2. **JDK开发包缺失** - `jps` 属于 **JDK开发工具**,若仅安装JRE或精简版JDK(如未安装 `openjdk-devel`),会缺少此命令。 3. **SSH会话未更新环境** - 修改环境变量后未关闭并重连SSH,导致配置未加载。 --- ### **解决方案** #### ✅ 方法1:刷新环境变量 ```bash source /etc/profile # 全局环境变量生效 source ~/.bashrc # 当前用户环境变量生效 ``` **关键步骤**:执行后**关闭SSH窗口并重新连接**,确保会话更新[^1]。 #### ✅ 方法2:检查JDK完整性 1. 确认已安装完整JDK开发包: ```bash # OpenJDK示例(CentOS/RHEL) sudo yum install java-1.8.0-openjdk-devel # 安装开发工具包 # Oracle JDK:确保下载的是JDK(含bin目录) ``` 2. 验证 `jps` 路径是否存在: ```bash find / -name jps 2>/dev/null # 搜索jps位置 ``` #### ✅ 方法3:手动配置环境变量 若 `$JAVA_HOME/bin` 未加入 `PATH`: 1. 编辑配置文件(如 `~/.bashrc` 或 `/etc/profile`): ```bash export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk # 替换为实际路径 export PATH=$PATH:$JAVA_HOME/bin ``` 2. 执行 `source` 并**重连SSH**[^1]。 #### ✅ 方法4:使用绝对路径临时调用 ```bash /usr/lib/jvm/jdk-11.0.2/bin/jps](https://example.com)] # 替换为实际路径 ``` --- ### **补充说明** - **权限问题**:若使用非root用户安装JDK,确保用户有 `$JAVA_HOME/bin` 的执行权限。 - **多版本冲突**:通过 `alternatives --config java` 检查默认JDK版本是否匹配。 - **验证命令**:执行 `java -version` 和 `javac -version` 双重验证JDK有效性。 > 经上述步骤操作后,99%的 `jps` 缺失问题可解决。若仍失败,建议检查JDK安装日志或尝试重装完整JDK包[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值