JVM 命令指北(2)-jps 命令

1. jps 命令介绍

jps位于 JDK (mac 终端使用命令/usr/libexec/java_home -V可查看 JDK 安装目录) 的 bin文件夹中,类似于 Linux 的 ps 命令,其作用是显示当前系统的 Java 进程情况。通过 jps 命令可以方便地查看 Java 进程的启动类、传入参数和 Java 虚拟机参数等信息,另外需注意,jps 仅查找系统当前用户的Java进程,而不是系统中所有Java进程

jps 命令原理

Java 程序启动后会在java.io.tmpdir指定的目录下生成一个类似于hsperfdata_user的文件夹,这个文件夹里的文件名称就是 Java 进程的pid。因此列出当前运行的Java进程,就是把该目录里的文件名列一下,解析这些文件就可以获得 Java 程序启动时的 JVM 参数

  • 操作系统不同,java.io.tmpdir属性指向的临时缓存目录也不一样,mac可在终端中使用命令find / -name "hsperfdata*"查找。实在不清楚的时候也可以在 main() 方法中添加以下代码,打印出缓存目录。另外 Java 启动时提供了参数-Djava.io.tmpdir,可以对缓存目录的路径进行设置
    System.out.println(System.getProperty("java.io.tmpdir"));
    

2. jps 参数功能

终端中使用命令 man jps可以查看 jps 的相关文档,其常用参数列表如下

参数 功能
-q 只显示pid,不显示class名称,jar文件名和传递给 main 方法的参数
-m 输出传递给main 方法的参数,在嵌入式jvm上可能是null
-l 输出应用程序 main calss 的完整包名或者应用的 Jar 包的全路径
-v 输出传递给 JVM 的参数
  • jps -q
    在这里插入图片描述
  • jps -v
    想知道应用的日志会输出到哪或者启动的时候使用了哪些 javaagent,就可以使用 jps -v 查看进程的 JVM 参数情况
    在这里插入图片描述

3. jps 注意事项

有时会存在 ps -ef|grep java能看到启动的 Java 进程,但是jps查看没有该 pid 的问题。之前也提到过,jps 的数据来源是java.io.tmpdir属性指向的临时缓存目录中的文件,当这些文件不存在或不能读取时就会出现 jps 看不到该进程号的问题。因此可检查是否是以下原因导致:

  1. 磁盘读写或目录权限问题
    用户没有权限写缓存目录或是磁盘已满,则无法创建 Java 进程信息文件。而文件已经生成,用户却没有读取权限也会导致问题

  2. 临时缓存文件被删除
    服务器一般都会定时对临时文件夹进行清理,临时缓存目录被清空时 jps 显然无法读取到任何信息

  3. 缓存目录路径被修改
    Java 启动时可使用参数-Djava.io.tmpdir对缓存文件的路径进行修改,有时这也是为了避免文件存放在缓存目录中被定时清理掉,而 jps 可能无法从修改后的目录读取信息

发布了97 篇原创文章 · 获赞 88 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_45505313/article/details/102885493