java进程在但jconsole等监控工具无法连接问题

来源:互联网 发布:林若亚 孙志浩 知乎 编辑:程序博客网 时间:2024/06/15 19:24

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启动时提供了参数(-Djava.io.tmpdir),可以对这个文件的位置进行设置,而jps、jconsole都只会从/tmp目录读取,而无法从设置后的目录读物信息,这是我第二次碰到该现象的原因

 

关于设置该文件位置的参数为-Djava.io.tmpdir

 

其他:

/tmp/hsperfdata_userName/pid文件会在对应java进程退出后被清除。如果java进程非正常退出(如kill -9),那么pid文件会被保留,直到执行一次java命令或是加载了jvm程序的命令(如jps、javac、jstat),会将所有无用的pid文件都清除掉。

         这个问题只会在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

如bug中的描述,如果运行的jdk版本是6u23或6u24,而此时又想看监控信息,可以按以下方式进行尝试:
Running monitoring applications with -J-Djava.io.tmpdir=(application java.io.tmpdir) works if you only wish to monitor that application. Setting the application's java.io.tmpdir to the system default works as long as the applications don't create conflicting file names. Conflicting file names are likely when more than one copy of a servlet container such as Tomcat is being run.

原创粉丝点击