Java内置工具包tools.jar(一)sun.tools.jstack.Jps

坚强是说给别人听的谎言 提交于 2019-12-16 11:33:41

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

 我们知道,在JAVA_HOME/bin下有诸多内置命令,是我们在使用Java或者监控、排查它时用到的命令。其中tools.jar中包含了大多数命令的执行入口。后面我将写一系列对这些命令的实现细节的文章,使用方法文本不做讨论。

        jps命令是java开发人员最常用的命令之一,它输出了当前用户下java进程的一些基本信息。我们从jps开始阅读,它的入口在sun.tools.jstack.Jps中。

        在参数校验逻辑之后,获取到jps命令中监控的目标机,然后从中拿到目标机中可用的jvm进程。

HostIdentifier hostId = arguments.hostId();
MonitoredHost monitoredHost = MonitoredHost.getMonitoredHost(hostId);

// get the set active JVMs on the specified host.
Set jvms = monitoredHost.activeVms();

        MonitoredHost监控的目标机可以是本地进程,也可以是通过RMI远程调用的进程。

获取到监控主机之后就要获取运行列表,这里是jps的数据来源,我们local模式为例,在MonitoredHostProvider#activeVms中获取的数据来源于这样一行代码:

PerfDataFile.getLocalVmId(paramX));

而paramX是根据用户名和一定规则拼凑起来得到:

tmpDirName + dirNamePrefix + user + File.separator;

tmpDirName取自String tmpdir = System.getProperty("java.io.tmpdir"); 参考初始化参数:-Djava.io.tmpdir。默认为

dirNamePrefix 为固定值:hsperfdata_

以admin角色为例最终得到/tmp/hsperfdata_xxx目录。顺藤摸瓜,直接到这个地址下瞧一瞧发现真有这么几个文件夹。

打开后发现里面的文件均为进程号,文件内容较多,但是可阅读,是一些启动参数、运行信息等。那么hsperfdata_xxx文件是干哈的?它是JVM Performance Counters的一部分,jvmstat通过文件的方式记录了进程在运行时刻的一些性能或运行信息。

了解到文件内容之后我们接着看Jps的代码,jps根据输入的参数对文件内容进行格式化输出,简而言之就是根据不同的选项对性能信息进行过滤。

至此,jps的命令结束。其他类似的性能监控工具如jconsole、jvisualvm的部分数据来源均为hsperfdata_xxx文件。

 

附:

jps无效处理:不知道大家有没有遇到过jps无效的情况,如“pid-- process information unavailable”。通过上面的内容了解到jps的数据来源为hsperfdata_xxx文件夹,jps无效多数原因与此文件或文件夹的权限、大小、磁盘空间等问题有关,希望这个信息能够提供一些思路。

 

https://zeroproductionincidents.wordpress.com/tag/jvm-performance-counters/

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!