JDK 工具之 jinfo 详解
概述
jinfo 用于查看正在运行的Java进程的配置信息。它可以用于查看Java进程的系统属性、VM参数、环境变量以及启动命令行参数等。
命令行详细的帮助文档可以参考:Oracle jinfo doc。本文只介绍一些常用的使用方法和技巧,以及使用过程中可能遇到一些问题,但不会对每个参数都作详细的说明。
使用方法
jinfo 接收一个 JAVA 进程的 pid 作为参数,可以使用 jps 获取 pid。假设 pid 是 11314,那么可运行一下命令:
jinfo 11314
输出的信息爆炸,这里仅摘取一点给大家参考,... 表示省略的部分。
...
JVM version is 25.301-b09
Java System Properties:
java.runtime.name = Java(TM) SE Runtime Environment
java.vm.version = 25.301-b09
sun.boot.library.path = /home/saltyfish/Public/dev/jdk-8u301-linux-x64/jdk1.8.0_301/jre/lib/amd64
java.vendor.url = http://java.oracle.com/
java.vm.vendor = Oracle Corporation
...
java.class.path = ...
java.vm.specification.version = 1.8
sun.arch.data.model = 64
sun.java.command = net.verytools.prac.MyMain
...
java.vm.info = mixed mode
java.version = 1.8.0_301
java.ext.dirs = ...
sun.boot.class.path = ...
java.vendor = Oracle Corporation
file.separator = /
sun.cpu.endian = little
VM Flags:
Non-default VM flags: -XX:CICompilerCount=4 -XX:InitialHeapSize=260046848 -XX:MaxHeapSize=4158652416 -XX:MaxNewSize=1386217472 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=86507520 -XX:OldSize=173539328 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:+UseParallelGC
...
这里有必要提一下,运行 jinfo 的时候可能会下面的报错:
Error attaching to process: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process: ptrace(PTRACE_ATTACH, ..) failed for 20289: Operation not permitted
...
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at sun.tools.jmap.JMap.runTool(JMap.java:201)
at sun.tools.jmap.JMap.main(JMap.java:130)
Caused by: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process: ptrace(PTRACE_ATTACH, ..) failed for 20289: Operation not permitted
at sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal.attach0(Native Method)
...
在 linux 下可以使用 su -
切换到 root 用户,然后运行以下命令:
echo 0 > /proc/sys/kernel/yama/ptrace_scope
如果需要修改永久生效,可以修改 /etc/sysctl.d/10-ptrace.conf,将其中的 kernel.yama.ptrace_scope = 1 这一行的值改成 0。
还可以直接使用 sudo /path/to/jinfo 11314
,不过这里需要注意的是:此时可能需要使用 jinfo 的绝对路径。 注:有些系统版本可能没有 /etc/sysctl.d/10-ptrace.conf 文件,此时你需要自行查找对应系统修改该参数的方法。
如果使用 docker,可以在 docker 容器启动时加入 --cap-add=SYS_PTRACE
参数。
docker run --cap-add=SYS_PTRACE -v /root:/root -it 1afc34a04692 bash
更多信息,可以参考:https://docs.rapidfort.com/how-to/add-sys-ptrace。
仅查看系统属性
使用 -sysprops
可以让输出简洁一些,仅仅输出 system properties。下面的命令中 11314 为 java 进程 id。如无特别说明,下文假设 java 进程的 pid 均为 11314。
jinfo -sysprops 11314
查看传递给 jvm 的命令行参数
如果只想看 jvm 命令行参数,可以使用 -flags
参数:
jinfo -flags 11314
输入结果如下:
VM Flags:
Non-default VM flags: -XX:CICompilerCount=4 -XX:InitialHeapSize=260046848 -XX:MaxHeapSize=4158652416 -XX:MaxNewSize=1386217472 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=86507520 -XX:OldSize=173539328 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:+UseParallelGC
...
上面输出的参数很多,可以使用 -flag
查看某个具体的参数值。假如我们想知道 InitialHeapSize 这个参数的值是什么,可以使用下面的命令:
jinfo -flag InitialHeapSize 11314
注:不仅可以查看,部分参数还支持修改。
jinfo 还支持获取远程 java 进程的配置信息,不过这个东西到底有没有人会用到呢?其实我也不是很清楚。如果真需要获取远程 java 进程的信息,可以直接登录到远程服务器使用 jinfo 获取信息即可。
温馨提示:反馈需要登录