• 必知必会Java命令-jps


    你好,我是阿光。

    最近想着把工作中使用过的java命令都梳理一下,方便日后查阅。虽然这类文章很多,但自己梳理总结后,还是会有一些新的收获。这也是这篇笔记的由来。

    今天先聊聊 jps 命令。

    命令概述⭐

    jps命令是JDK提供的一个工具,用于查看目标系统上的Java进程基本信息(进程ID, 启动类,启动参数等)。命令在JDK安装目录的bin目录下,比如在我的window下D:\Java\jdk1.8.0\bin\jps.exe。但JRE没有提供这个命令。不过从Java9模块化开始,已经不区分JDK和JRE了。

    这个命令只会检测到目标系统上HotSpot版本的,具有访问权限的JVM信息。

    命令的官方文档可查看这个地址The jps Command (oracle.com)

    命令用法⛵

    我的演示环境是在window11, jdk17版本下

    我们可以通过jps -h 或者 jps --help 或者 jps -help查看这个命令的基本用法:

    jps --help
    usage: jps [--help]
           jps [-q] [-mlvV] [<hostid>]
    
    Definitions:
        <hostid>:      <hostname>[:<port>]
        -? -h --help -help: Print this help message and exit.
    

    中括号里的选项都是可选的,最简单的就是jps

    jps
    35936 Jps
    1076  RemoteMavenServer36
    

    这里没有指定主机,所以只会查找本地主机上的JVM。第一列是进程ID,第二列是启动类名。可以看到,jps命令本身也是一个Java进程,它的启动类是Jps。

    -q选项会让命令只输出进程ID,如下:

    jps -q
    35936
    1076
    

    -mlvV选项可以任意指定一个,也可以同时指定多个,它们可以随意组合。

    • -m 选项会显示传递给main方法的参数,即程序自定义的一些参数。
    • -l 选项会显示启动类的完整包名称或者启动JAR的完整路径名。
    • -v 选项会显示传递给虚拟机的参数,比如-Dxxx=v形式指定的参数,-Xms128M参数等。
    • -V 大V选项只会输出PID和类名,jpsjps -V的输出是一样的。

    这里我本地运行了一个Java进程,启动类是Main,并且指定了一些自定义的参数.

    1. 列出main方法参数:jps -m
    jps -m
    16596 Main test=11 测试参数:a
    18796 Jps -m
    
    1. 列出启动类全名:jps -l
    jps -l
    16596 com.ggy.softman.Main
    11836 jdk.jcmd/sun.tools.jps.Jps
    
    1. 列出虚拟机参数:jps -v
    jps -v
    29716 Main -Dfile.encoding=UTF-8 -Dsun.stdout.encoding=UTF-8 -Dsun.stderr.encoding=UTF-8
    11388 Jps -Dapplication.home=D:\Java\jdk-17.0.6.10 -Xms8m -Djdk.module.main=jdk.jcmd
    
    1. 组合命令,输出信息更丰富:jps -lmv
    jps -lmv
    31948 com.ggy.softman.Main test=11 测试参数:a -Dfile.encoding=UTF-8 -Dsun.stdout.encoding=UTF-8 -Dsun.stderr.encoding=UTF-8
    29008 jdk.jcmd/sun.tools.jps.Jps -lmv -Dapplication.home=D:\Java\jdk-17.0.6.10 -Xms8m -Djdk.module.main=jdk.jcmd
    

    该命令也可以显示远程主机的Java进程信息,只要在命令的最后带上hostid。这种情况基本使用很少,这里也没演示了,可以查看官网文档。

    连接远程主机时,远程主机上必须运行jstatd命令。

    使用场景🌳

    这里我总结了一下日常开发中,使用到该命令的场景。

    1. 有时候需要登录到服务器上排查一些问题,查看服务日志,但不太清楚程序部署在哪个目录下,这时候我会通过jps -lv | grep xxx 查询指定名的程序,一般在输出里会显示一些目录信息。
    2. 快速查看Java服务是否正常,PID是什么,然后结合其他命令使用。
    3. 有些情况下,快速查看下Java服务的参数是否配置正确。

    常见问题❓

    这里我总结了一下该命令经常会遇到的一些问题。

    1. command not found

    出现这个报错,一般有两种情况,一是没有配置好JAVA_HOME环境变量,二是安装的是JRE,没有带jps命令。

    还有种情况是使用的JDK版本低于1.5。

    1. 命令执行后没有任何输出,或者ps命令显示有Java进程,但jps命令没有显示该进程。

    出现这种情况,可以按以下步骤排查:

    a. Java服务和jps命令是否是在同一个用户下运行的;

    b. {tmpdir}/hsperfdata_{user_name}/目录下是否有文件。tmpdir是系统临时目录。

    window一般是: C:\Users\user_name\AppData\Local\Temp\

    linux一般是: /tmp

    如果当前用户没有该临时目录的读取权限,jps命令也会失效。

    有时候linux系统会定时清理临时目录,也会导致该目录为空。

    jps命令其实是用Java实现的,原理就是通过扫描{tmpdir}/hsperfdata_{user_name}/目录下的进程文件。每个Java进程启动时,都会在该目录下生成一个以PID命名的文件。下面是我window下的:

    每个进程文件里都记录了该虚拟机进程的很多信息。基本上很多Java命令都是从这个文件里获取一些信息的。下面是文件的部分内容:

    很多Java命令都可以看到源码,Java1.8及以下版本是在lib/tools.jar里,1.8以上版本移到了多个模块下,jps、jstack、jinfo等基本命令是在jmods/jdk.jcmd.jmod里,还有一些是在独立的模块下,比如jdk.jlink.jmod。

    有时遇到一些奇怪的异常时,可以使用 jps -J-Djps.debug=true -J-Djps.printStackTrace=true命令,可以获取到jps命令的详细错误信息。

    jps命令就是这些了,下次jstack再见。

    参考资料ℹ️

    1. The jps Command (oracle.com)
  • 相关阅读:
    C++11之线程库
    计算机网络原理 谢希仁(第8版)第二章习题答案
    第二十六章 源代码文件 REST API 参考(八)
    工业交换机ERPS环网协议工作原理介绍
    竞赛 基于机器视觉的行人口罩佩戴检测
    5 分钟带你小程序入门 [实战总结分享]
    棒球游戏代码编写·棒球1号位
    Oracle使用exp和imp命令实现数据库导出导入
    Druid连接池的快速使用
    C#:实现鸡尾酒定向冒泡排序算法(附完整源码)
  • 原文地址:https://www.cnblogs.com/gonggy/p/17892704.html