jps无法显示jvm进程

http://trinea.iteye.com/blog/1196400

 

1、jps的作用

jps类似linux的ps命令,不同的是ps是用来显示进程,而jps只显示java进程,准确的说是当前用户已启动的部分java进程信息,信息包括进程号和简短的进程command。

 

2、某个java进程已经启动,用jps却显示不了该进程进程号

这个问题已经碰到过两次了,所以在这里总结下。

现象:

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

 

分析:

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

 

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

 

原因:

(1)、磁盘读写、目录权限问题

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

 

(2)、临时文件丢失,被删除或是定期清理

对于linux机器,一般都会存在定时任务对临时文件夹进行清理,导致/tmp目录被清空。这也是我第一次碰到该现象的原因

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

 

(3)、java进程信息文件存储地址被设置,不在/tmp目录下

上面我们在介绍时说默认会在/tmp/hsperfdata_userName目录保存进程信息,但由于以上1、2所述原因,可能导致该文件无法生成或是丢失,所以java启动时提供了参数,可以对这个文件的位置进行设置,而jps、jconsole都只会从/tmp目录读取,而无法从设置后的目录读物信息,

         这个问题只会在jdk 6u23和6u24上出现,在6u23和6u24上,进程信息会保存在-Djava.io.tmpdir下, 因此如果它被设置为非/tmp目录则会导致 jps,jconsole等无法读取的现象, 但在其他版本的jdk上,即使设置-Djava.io.tmpdir为非/tmp,  也会在/tmp/hsperfdata_userName下保存java进程信息.因此可以说这是6u23和6u24的bug,

         以下是jdk对该bug的描述地址:

bug描述:
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7021676
bug的修复描述:
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7009828
bug修改代码:
http://hg.openjdk.java.net/jdk7/hotspot/hotspot/rev/34d64ad817f4

 

### JVM 进程详解 #### 守护线程 (Daemon Threads) 守护线程是一种特殊类型的线程,在 Java 虚拟机 (JVM) 中运行于后台。这些线程不会阻止 JVM 的正常退出操作。如果 JVM 中仅剩下守护线程而没有任何用户线程存在,则 JVM 将自动终止其运行环境[^1]。通常情况下,守护线程被用于执行诸如垃圾回收、定时任务以及其他不需要显式结束的任务。 #### JVM 内存区域划分 JVM 的内存结构由多个不同的部分组成,主要包括堆区(Heap)、方法区(Method Area)、虚拟机栈(VM Stack)、本地方法栈(Native Method Stack)以及程序计数器(Program Counter Register)。每一块都有特定的功能和用途,共同支持 Java 应用程序的高效运行[^2]: - **堆区**: 动态分配对象实例的主要存储空间。 - **方法区**: 存储已被虚拟机加载的类信息、常量池数据等静态元数据。 - **虚拟机栈**: 记录每个线程的方法调用序列及其局部变量表。 - **本地方法栈**: 类似于 VM 栈,但是服务于 Native 方法。 - **程序计数器**: 当前线程所执行字节码指令地址跟踪寄存器。 #### 查看 JVM 进程状态 为了监控正在运行的 JVM 实例的状态,开发者可以利用 `jps` 命令来获取基本信息,比如进程 ID 和启动路径等内容。此工具类似于 Unix/Linux 平台下的标准 ps 工具,但它专注于展示 java 相关的信息,并且只列举当前用户具有访问权限的那些进程记录[^3]。 #### Gradle 构建过程中涉及的 JVM 进程种类 在使用 Gradle 执行构建任务期间,可能会涉及到三种独立的 JVM 进程形式——Client Process, Daemon Process 及 Wrapper Process。其中 Client 是指发起请求的那个外部客户端;Daemon 则作为长期存活的服务端角色持续工作以便快速响应后续请求;Wrapper 提供了一种标准化方式去跨平台一致地初始化项目所需的正确版本 gradle binary 文件并激活相应 jvm instance 来完成实际作业处理流程[^4]。 ```bash # 使用 jps 查找所有 JVM 进程 jps -lv ``` 上述脚本展示了如何通过 shell 终端界面查询系统上存在的全部 java application processes list along with their full command line arguments. ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值