4. Java命令行工具 -- jps

本文详细介绍了JDK1.5中的jps命令的工作原理及使用方法。jps用于展示当前所有Java进程PID,通过解析/tmp/hsperfdata_用户名目录下的文件来获取相关信息。文章还探讨了jps失效的情况及其解决办法。
功能

jps(Java Virtual Machine Process Status Tool)是JDK 1.5提供的一个显示当前所有java进程pid的命令,简单实用,非常适合在linux/unix平台上简单察看当前java进程的一些简单情况。

原理

jdk中的jps命令可以显示当前运行的java进程以及相关参数,它的实现机制如下:
java程序在启动以后,会在java.io.tmpdir指定的目录下,就是临时文件夹里,生成一个类似于hsperfdata_User的文件夹,这个文件夹里(在Linux中为/tmp/hsperfdata_{userName}/),有几个文件,名字就是java进程的pid,因此列出当前运行的java进程,只是把这个目录里的文件名列一下而已。 至于系统的参数什么,就可以解析这几个文件获得。
这里写图片描述

上面的内容就是我机器中/tmp/hsperfdata_hollis目录下的内容,其中2756, 2975就是我机器上当前运行中的java的进程的pid,我们执行jps验证一下:
这里写图片描述

使用

先来看看帮助,使用jps -help查看帮助。
这里写图片描述

  • -q 只显示pid,不显示class名称,jar文件名和传递给main 方法的参数。
    这里写图片描述

  • -m 输出传递给main 方法的参数,在嵌入式jvm上可能是null。
    这里写图片描述

  • -l 输出应用程序main class的完整package名 或者 应用程序的jar文件完整路径名。
    这里写图片描述

  • -v 输出传递给JVM的参数
    这里写图片描述

JPS失效

现象: 用ps -ef|grep java能看到启动的java进程,但是用jps查看却不存在该进程的id。待会儿解释过之后就能知道在该情况下,jconsole、jvisualvm可能无法监控该进程,其他java自带工具也可能无法使用

分析: jps、jconsole、jvisualvm等工具的数据来源就是这个文件(/tmp/hsperfdata_userName/pid)。所以当该文件不存在或是无法读取时就会出现jps无法查看该进程号,jconsole无法监控等问题

原因

  1. 磁盘读写、目录权限问题 若该用户没有权限写/tmp目录或是磁盘已满,则无法创建/tmp/hsperfdata_userName/pid文件。或该文件已经生成,但用户没有读权限
  2. 临时文件丢失,被删除或是定期清理 对于linux机器,一般都会存在定时任务对临时文件夹进行清理,导致/tmp目录被清空。这也是我第一次碰到该现象的原因。常用的可能定时删除临时目录的工具为crontab、redhat的tmpwatch、ubuntu的tmpreaper等等
    这个导致的现象可能会是这样,用jconsole监控进程,发现在某一时段后进程仍然存在,但是却没有监控信息了。
  3. java进程信息文件存储地址被设置,不在/tmp目录下 上面我们在介绍时说默认会在/tmp/hsperfdata_userName目录保存进程信息,但由于以上1、2所述原因,可能导致该文件无法生成或是丢失,所以java启动时提供了参数(-Djava.io.tmpdir),可以对这个文件的位置进行设置,而jps、jconsole都只会从/tmp目录读取,而无法从设置后的目录读物信息,这是我第二次碰到该现象的原因
参考

Java命令学习系列(一)— Jps

Abnormal build process termination: D:\code\jdk8\bin\java.exe -Xmx700m -Djava.awt.headless=true -Djava.endorsed.dirs=\"\" -Dpreload.project.path=D:/aek/project/untitled -Dpreload.config.path=C:/Users/feifan/AppData/Roaming/JetBrains/IntelliJIdea2022.2/options -Dcompile.parallel=false -Drebuild.on.dependency.change=true -Didea.IntToIntBtree.page.size=32768 -Djdt.compiler.useSingleThread=true -Daether.connector.resumeDownloads=false -Dio.netty.initialSeedUniquifier=-7870843755010772310 -Dfile.encoding=UTF-8 -Duser.language=zh -Duser.country=CN -Didea.paths.selector=IntelliJIdea2022.2 "-Didea.home.path=D:/softwore/IntelliJ IDEA 2022.2.3" -Didea.config.path=C:/Users/feifan/AppData/Roaming/JetBrains/IntelliJIdea2022.2 -Didea.plugins.path=C:/Users/feifan/AppData/Roaming/JetBrains/IntelliJIdea2022.2/plugins -Djps.log.dir=C:/Users/feifan/AppData/Local/JetBrains/IntelliJIdea2022.2/log/build-log "-Djps.fallback.jdk.home=D:/softwore/IntelliJ IDEA 2022.2.3/jbr" -Djps.fallback.jdk.version=17.0.4.1 -Dio.netty.noUnsafe=true -Djava.io.tmpdir=C:/Users/feifan/AppData/Local/JetBrains/IntelliJIdea2022.2/compile-server/untitled_11b9af6c/_temp_ -Djps.backward.ref.index.builder=true -Dkotlin.incremental.compilation=true -Dkotlin.incremental.compilation.js=true -Dkotlin.daemon.enabled -Dkotlin.daemon.client.alive.path=\"C:\Users\feifan\AppData\Local\Temp\kotlin-idea-3869496449325725092-is-running\" "-Djps.kotlin.home=D:\softwore\IntelliJ IDEA 2022.2.3\plugins\Kotlin\kotlinc" -Dtmh.instrument.annotations=true -Dtmh.generate.line.numbers=true -Dide.propagate.context=false -classpath "D:/softwore/IntelliJ IDEA 2022.2.3/plugins/java/lib/jps-launcher.jar;D:/code/jdk8/lib/tools.jar" org.jetbrains.jps.cmdline.Launcher "D:/softwore/IntelliJ IDEA 2022.2.3/plugins/java/lib/jps-builders.jar;D:/softwore/IntelliJ IDEA 2022.2.3/plugins/java/lib/jps-builders-6.jar;D:/softwore/IntelliJ IDEA 2022.2.3/plugins/java/lib/jps-javac-extension.jar;D:/softwore/IntelliJ IDEA 2022.2.3/lib/util.jar;D:/softwore/IntelliJ IDEA 2022.2.3/lib/util_rt.jar;D:/softwore/IntelliJ IDEA 2022.2.3/lib/annotations.jar;D:/softwore/IntelliJ IDEA 2022.2.3/lib/3rd-party-rt.jar;D:/softwore/IntelliJ IDEA 2022.2.3/lib/jna.jar;D:/softwore/IntelliJ IDEA 2022.2.3/lib/lz4-java.jar;D:/softwore/IntelliJ IDEA 2022.2.3/lib/protobuf.jar;D:/softwore/IntelliJ IDEA 2022.2.3/lib/jps-model.jar;D:/softwore/IntelliJ IDEA 2022.2.3/plugins/java/lib/javac2.jar;D:/softwore/IntelliJ IDEA 2022.2.3/lib/forms_rt.jar;D:/softwore/IntelliJ IDEA 2022.2.3/plugins/java/lib/aether-dependency-resolver.jar;D:/softwore/IntelliJ IDEA 2022.2.3/lib/idea_rt.jar;D:/softwore/IntelliJ IDEA 2022.2.3/plugins/Kotlin/lib/jps/kotlin-jps-plugin.jar;D:/softwore/IntelliJ IDEA 2022.2.3/lib/util.jar;D:/softwore/IntelliJ IDEA 2022.2.3/plugins/JavaEE/lib/jasper-v2-rt.jar;D:/softwore/IntelliJ IDEA 2022.2.3/plugins/eclipse/lib/eclipse-jps.jar;D:/softwore/IntelliJ IDEA 2022.2.3/plugins/eclipse/lib/eclipse-common.jar;D:/softwore/IntelliJ IDEA 2022.2.3/plugins/space/lib/space-java-jps.jar;D:/softwore/IntelliJ IDEA 2022.2.3/plugins/uiDesigner/lib/jps/java-guiForms-jps.jar;D:/softwore/IntelliJ IDEA 2022.2.3/plugins/JavaEE/lib/javaee-jps.jar;D:/softwore/IntelliJ IDEA 2022.2.3/plugins/IntelliLang/lib/java-langInjection-jps.jar;D:/softwore/IntelliJ IDEA 2022.2.3/plugins/javaFX/lib/javaFX-jps.jar;D:/softwore/IntelliJ IDEA 2022.2.3/plugins/javaFX/lib/javaFX-common.jar;D:/softwore/IntelliJ IDEA 2022.2.3/plugins/Groovy/lib/groovy-jps.jar;D:/softwore/IntelliJ IDEA 2022.2.3/plugins/Groovy/lib/groovy-constants-rt.jar;D:/softwore/IntelliJ IDEA 2022.2.3/plugins/devkit/lib/devkit-jps.jar;D:/softwore/IntelliJ IDEA 2022.2.3/plugins/JPA/lib/jps/javaee-jpa-jps.jar;D:/softwore/IntelliJ IDEA 2022.2.3/plugins/ant/lib/ant-jps.jar;D:/softwore/IntelliJ IDEA 2022.2.3/plugins/maven/lib/maven-jps.jar;D:/softwore/IntelliJ IDEA 2022.2.3/plugins/gradle-java/lib/gradle-jps.jar" org.jetbrains.jps.cmdline.BuildMain 127.0.0.1 49973 b32f25d2-9e31-4f25-80b0-5f49e978ab79 C:/Users/feifan/AppData/Local/JetBrains/IntelliJIdea2022.2/compile-server Exception in thread "main" java.lang.ExceptionInInitializerError at sun.nio.fs.WindowsFileSystem.<init>(WindowsFileSystem.java:67) at sun.nio.fs.WindowsFileSystemProvider.<init>(WindowsFileSystemProvider.java:53) at sun.nio.fs.DefaultFileSystemProvider.create(DefaultFileSystemProvider.java:36) at java.nio.file.FileSystems$DefaultFileSystemHolder.getDefaultProvider(FileSystems.java:108) at java.nio.file.FileSystems$DefaultFileSystemHolder.access$000(FileSystems.java:89) at java.nio.file.FileSystems$DefaultFileSystemHolder$1.run(FileSystems.java:98) at java.nio.file.FileSystems$DefaultFileSystemHolder$1.run(FileSystems.java:96) at java.security.AccessController.doPrivileged(Native Method) at java.nio.file.FileSystems$DefaultFileSystemHolder.defaultFileSystem(FileSystems.java:96) at java.nio.file.FileSystems$DefaultFileSystemHolder.<clinit>(FileSystems.java:90) at java.nio.file.FileSystems.getDefault(FileSystems.java:176) at java.nio.file.Paths.get(Paths.java:84) at org.jetbrains.jps.cmdline.LogSetup.initLoggers(LogSetup.java:30) at org.jetbrains.jps.cmdline.BuildMain.<clinit>(BuildMain.java:47) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.jetbrains.jps.cmdline.Launcher.main(Launcher.java:43) Caused by: java.nio.charset.UnsupportedCharsetException: Cp65001 at java.nio.charset.Charset.forName(Charset.java:531) at sun.nio.fs.Util.<clinit>(Util.java:41) ... 19 more 这个运行报错和idea有关系吗?我有什么办法可以直接测试定位是不是java的问题吗
最新发布
08-12
### 三级标题:错误背景与含义解析 `java.lang.ExceptionInInitializerError` 是一种在类初始化过程中发生的错误,通常由静态初始化块或静态变量初始化时抛出的异常引起。当 JVM 尝试加载类并执行其静态初始化代码时,如果出现异常,就会抛出 `ExceptionInInitializerError`,并将其作为包装异常的抛出 [^4]。 而 `java.nio.charset.UnsupportedCharsetException: Cp65001` 表示在尝试使用字符集 `Cp65001`(即 UTF-8 编码的一种标识符)时,系统无法识别或支持该字符集。这种情况通常与 Java 环境或运行时的字符集支持有关 [^3]。 ### 三级标题:是否与 IntelliJ IDEA 相关 该错误通常不是由 IntelliJ IDEA 本身引起的,而是由 Java 运行时环境(JRE/JDK)或项目配置问题导致的。IntelliJ IDEA 作为开发工具,仅负责启动和运行 Java 应用程序,因此该错误更可能源于以下方面: - **JDK 版本问题**:某些 JDK 版本可能不完全支持特定的字符集处理机制。 - **运行时参数配置**:IDEA 启动时可能设置了特定的系统属性(如 `file.encoding`),导致字符集解析异常。 - **环境变量设置**:操作系统层面的区域设置或编码配置可能影响 Java 应用程序的行为 [^1]。 ### 三级标题:如何测试是否为 Java 环境问题 为了确认该错误是否由 Java 环境引起,可以执行以下步骤进行验证: 1. **命令行运行测试**:将项目打包为可执行 JAR 文件,并在命令行中直接运行,避免通过 IntelliJ IDEA 启动。例如: ```bash java -jar your-application.jar ``` 如果命令行中也出现相同的异常,则可以确认问题与 Java 环境有关 [^3]。 2. **检查 `file.encoding` 设置**:在 IntelliJ IDEA 的 VM Options 中查看是否设置了 `file.encoding` 属性。可以在 Run/Debug Configurations 的 VM options 中检查或修改: ``` -Dfile.encoding=UTF-8 ``` 如果未设置,尝试添加该配置并重新运行程序 [^2]。 3. **测试不同 JDK 版本**:尝试使用不同版本的 JDK(如 OpenJDK 8、11、17)运行项目,观察是否仍然报错。某些 JDK 版本可能存在字符集支持的限制或 Bug [^1]。 4. **检查系统区域设置**:在 Windows 上,`Cp65001` 是控制台使用的 UTF-8 编码标识符。可以通过以下命令查看当前控制台编码: ```bash chcp ``` 如果返回 `65001`,则表示当前使用的是 UTF-8 编码。可以尝试在非 UTF-8 编码环境下运行 Java 程序,或显式设置 JVM 使用 UTF-8 编码 。 ### 三级标题:示例测试代码 可以编写一个简单的 Java 程序来测试字符集支持情况: ```java import java.nio.charset.Charset; public class CharsetTest { public static void main(String[] args) { System.out.println("Default Charset: " + Charset.defaultCharset()); System.out.println("Available Charsets: " + Charset.availableCharsets()); } } ``` 运行该程序可以查看当前 Java 环境支持的字符集,确认是否包含 UTF-8 相关的编码 [^3]。 ### 三级标题:总结与建议 虽然 IntelliJ IDEA 提供了 Java 应用的运行环境配置界面,但 `java.lang.ExceptionInInitializerError` 和 `UnsupportedCharsetException` 更多是 Java 运行时问题。通过命令行测试、JDK 切换、VM 参数调整等方式,可以有效定位问题根源并进行修复 [^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值