(http://www.hollischuang.com/archives/303)
jsp位于jdk的bin目录下(/usr/lib/jvm/java/bin),其作用是现实当前系统的Java进程情况,及其id号,jps 并不使用应用程序名来查找JVM实例。因此,它查找所有的Java应用程序,包括及时没有使用Java执行体的那种(例如,定制的启动器)。另外,jps仅查找当前用户的Java进程,而不是当前系统中所有进程。
原理
jdk中的jps命令可以显示当前运行的Java进程以及相关参数,它的实现机制如下:
Java程序在启动以后,会在java.io.tmpdir指定的目录下,就是临时文件夹是,生成一个类似于hsperfdaa_User的文件夹(直接就是cd /tmp/hsperfdata_username)这个文件夹里有几个文件,名字就是java进程的pid,可以通过解析这几个文件获得系统的参数。(其中有jsp使用进程的pid,因为它也是java命令也要开一个进程)。
jps失效处理
现象:用ps -ef|grep java 能看到启动的java进程,但是用jps查看却不存在该进程id。在该情况下jconsole/jvidualvm可能无法监控该进程,其他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目录读取,而无法从设置后的目录读物信息,这是我第二次碰到该现象的原因