你好,我是阿光。

最近想着把工作中使用过的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)

必知必会Java的更多相关文章

  1. 第5节:Java基础 - 必知必会(下)

    第5节:Java基础 - 必知必会(下) 本小节是Java基础篇章的第三小节,主要讲述Java中的Exception与Error,JIT编译器以及值传递与引用传递的知识点. 一.Java中的Excep ...

  2. 第4节:Java基础 - 必知必会(中)

    第4节:Java基础 - 必知必会(中) 本小节是Java基础篇章的第二小节,主要讲述抽象类与接口的区别,注解以及反射等知识点. 一.抽象类和接口有什么区别 抽象类和接口的主要区别可以总结如下: 抽象 ...

  3. 第3节:Java基础 - 必知必会(上)

    第3节:Java基础 - 必知必会(上) 本篇是基础篇的第一小节,我们从最基础的java知识点开始学习.本节涉及的知识点包括面向对象的三大特征:封装,继承和多态,并且对常见且容易混淆的重要概念覆盖和重 ...

  4. Java并发必知必会第三弹:用积木讲解ABA原理

    Java并发必知必会第三弹:用积木讲解ABA原理 可落地的 Spring Cloud项目:PassJava 本篇主要内容如下 一.背景 上一节我们讲了程序员深夜惨遭老婆鄙视,原因竟是CAS原理太简单? ...

  5. 必知必会之Java注解

    必知必会之Java注解 目录 不定期更新中-- 元注解 @Documented @Indexed @Retention @Target 常用注解 @Deprecated @FunctionalInte ...

  6. 必知必会之 Java

    必知必会之 Java 目录 不定期更新中-- 基础知识 数据计量单位 面向对象三大特性 基础数据类型 注释格式 访问修饰符 运算符 算数运算符 关系运算符 位运算符 逻辑运算符 赋值运算符 三目表达式 ...

  7. Java面试必知必会(扩展)——Java基础

    float f=3.4;是否正确? 不正确 3.4是双精度,将双精度赋值给浮点型属于向下转型,会造成精度损失: 因此需要强制类型转换: 方式一:float f=(float)3.4 方式二:float ...

  8. Java面试必知必会:基础

    面试考察的知识点多而杂,要完全掌握需要花费大量的时间和精力.但是面试中经常被问到的知识点却没有多少,你完全可以用 20% 的时间去掌握 80% 常问的知识点. 一.基础 包括: 杂七杂八 面向对象 数 ...

  9. mysql必知必会系列(一)

    mysql必知必会系列是本人在读<mysql必知必会>中的笔记,方便自己以后查看. MySQL. Oracle以及Microsoft SQL Server等数据库是基于客户机-服务器的数据 ...

  10. 《MySQL必知必会》整理

    目录 第1章 了解数据库 1.1 数据库基础 1.1.1 什么是数据库 1.1.2 表 1.1.3 列和数据类型 1.1.4 行 1.1.5 主键 1.2 什么是SQL 第2章 MySQL简介 2.1 ...

随机推荐

  1. 角度新奇!第一次看到这样使用MyBatis的,看得我一愣一愣的。

    你好呀,我是歪歪. 这期给大家分享一个读者给我分享的一个关于 MyBatis 的"编程小技巧",说真的,这骚操作,直接把我看得一愣一愣的. 我更情愿叫它:坑你没商量之埋雷大法. D ...

  2. 四层负载均衡的NAT模型与DR模型推导

    导读 本文首先讲述四层负载均衡技术的特点,然后通过提问的方式推导出四层负载均衡器的NAT模型和DR模型的工作原理.通过本文可以了解到四层负载均衡的技术特点.NAT模型和DR模型的工作原理.以及NAT模 ...

  3. 要调用API接口获取商品数据,首先需要了解该API的文档和规范

    ​ 要调用API接口获取商品数据,首先需要了解该API的文档和规范.大多数API都需要使用API密钥进行身份验证,因此您需要先注册API提供商,并从他们那里获取API密钥.以下是一些通用的步骤: 1. ...

  4. Codeforces Round #576 (Div. 2)

    A - City Day 题意:给n,x,y和数组a[n],求最小的下标d,使得有a[d-x,d-x+1,--d-1,d+1,d-1,d+1,--d+y-1,d+y]都比a[d]小,若d-x<= ...

  5. 通过提示大语言模型进行个性化推荐LLM-Rec: Personalized Recommendation via Prompting Large Language Models

    论文原文地址:https://arxiv.org/abs/2307.15780 本文提出了一种提示LLM并使用其生成的内容增强推荐系统的输入的方法,提高了个性化推荐的效果. LLM-Rec Promp ...

  6. 「codeforces - 1481F」AB Tree

    link. 理一下逻辑,主要讲一下我做题时的疑惑和其它题解没提到的细节. 首先容易看到,一个必然不劣的贪心策略是把尽量靠近根的层铺成同样的字符.也许会有疑惑,字符串是否本质不同的判定每个位置地位相等. ...

  7. 深入解析 C++ 中的 ostringstream、istringstream 和 stringstream 用法

    引言: 在 C++ 中,ostringstream.istringstream 和 stringstream 是三个非常有用的字符串流类,它们允许我们以流的方式处理字符串数据.本文将深入探讨这三个类的 ...

  8. 2020/4/26 2-sat 学习笔记

    2-sat 吧.... 其实我jio得它一点都不难 嗯 2-sat是个啥东西呢?其实就是有很多人,他们每个人有两个要求,一个要求可以说是要求一个数为0或1而对于第i个数,我们可以选择为0或为1最终询问 ...

  9. 探究——C# .net 代码混淆/加壳

    背景: 保密. 过程: 先查询一下常见的加壳工具: DotFuscator,官方自带,据说免费版混淆程度不高 Virbox Protector,很好很优秀,但是收费 NET Reactor,可能会被识 ...

  10. P4899 [IOI2018] werewolf 狼人 题解

    P4899 [IOI2018] werewolf 狼人 题解 题目描述 省流: \(n\) 个点,\(m\) 条边,\(q\) 次询问,对于每一次询问,给定一个起点 \(S\) 和终点 \(T\) , ...