【推荐】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/
来源:oschina
链接:https://my.oschina.net/u/859433/blog/795122