jinfo介绍[通俗易懂]

jinfo介绍[通俗易懂]1 jinfo 1 1 简介 jinfo 用于打印 java 的配置信息 这些配置信息包括 java system properties jvm 命令行参数 通过查看这些配置信息 可以了解 java 进程的运行时环境 例如加载类的顺序 jvm 配置情况等 1 2 使用 jinfo pid 即不加参数 jinfo 后面直接跟进程 id 会同时打印 jvm 命令行参数和 java system

1. jinfo

1.1 简介

jinfo用于打印java的配置信息,这些配置信息包括:

java system properties

jvm命令行参数

通过查看这些配置信息,可以了解java进程的运行时环境,例如加载类的顺序、jvm配置情况等。

1.2 使用

jinfo pid . 即不加参数,jinfo后面直接跟进程id。会同时打印jvm命令行参数和java system properties

jinfo -flags pid . 只打印jvm命令行参数

jinfo -sysprops pid . 只打印java system properties

举例来说,我们运行如下java程序

java -jar -Dtest test-1.0-SNAPSHOT.jar &

其中配置了一个jvm命令行参数-Dtest,注意jvm命令行参数要再jar包前面,否则就成为了main函数的参数了。 使用

jps -lm

查看进程id,这里得到的进程id是3107778,使用

jinfo 3107778

打印进程的配置信息,包括jvm参数和java system properties。打印结果大致如下:

Attaching to process ID 3107778, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.131-b11
Java System Properties: // 第一部分: Java System Properties

java.runtime.name = Java(TM) SE Runtime Environment
java.vm.version = 25.131-b11
test = // 重点
....// 忽略中间的system properties

sun.io.unicode.encoding = UnicodeLittle
sun.cpu.endian = little
sun.cpu.isalist =

VM Flags: // 第二部分:jvm 参数
Non-default VM flags: -XX:CICompilerCount=15 -XX:InitialHeapSize=2147483648 -XX:MaxHeapSize=32210157568 -XX:MaxNewSize=10736369664 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=715653120 -XX:OldSize=1431830528 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:+UseParallelGC
Command line: -Dtest // jvm命令行参数

2. java system properties

在平常的一些项目中,我们会使用Properties来保存一些配置信息。同样在java本身也会用Properties来保存java平台的配置信息,这个就是java system properties。System properties主要包含了current user、the current version of the Java runtime、jvm加载的类的路径等信息。

这个Properties就在java.lang.System类中。可以通过查看代码看到System中有个props的属性,这个便是刚才提到的java system properties:

public final class System {
//....
/**
* System properties. The following properties are guaranteed to be defined:
*

*
java.version
Java version number
*
java.vendor
Java vendor specific string
*
java.vendor.url
Java vendor URL
*
java.home
Java installation directory
*
java.class.version
Java class version number
*
java.class.path
Java classpath
*
os.name
Operating System Name
*
os.arch
Operating System Architecture
*
os.version
Operating System Version
*
file.separator
File separator ("/" on Unix)
*
path.separator
Path separator (":" on Unix)
*
line.separator
Line separator ("\n" on Unix)
*
user.name
User account name
*
user.home
User home directory
*
user.dir
User's current working directory
*

*/

private static Properties props;
//...
}

System提供了相应的get/set方法来修改该类,但是使用set修改System properties被视为是危险的动作,而且会有一些安全限制。那么如果我们想在java启动的时候通过jvm命令行参数来配置system properties应该怎么做呢?答案是使用类似上面启动java程序的参数,即

-Dkey=value

这样的格式。如果不写=value,则得到的为空字符串。例如上面提到的启动java程序,配置了-Dtest:

java -jar -Dtest test-1.0-SNAPSHOT.jar &

在其jinfo的输出中,我们可以看到jvm命令行参数是-Dtest,同时在system properties中存在“test=”的properties项。

假设上述程序main函数如下:

public static void main(String[] args) throws Exception {
String s = System.getProperties().getProperty("test");
if (s == null) {
System.out.println("null");
}
System.out.println("DDD " + s);
}

则得到s为””,最终打印结果是,如果配置启动命令为

java -jar -Dtest=aaa test-1.0-SNAPSHOT.jar &

则上述代码运行结果为DDD aaa。 如果value有空格,则需要加引号(e.g. -Dfoo=”foo bar”)

3. 参考

jinfo man page

https://docs.oracle.com/javase/tutorial/essential/environment/sysprop.html

https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html

编程小号
上一篇 2025-01-16 19:30
下一篇 2025-01-16 19:21

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/hz/148873.html