jinfo用于打印java的配置信息,这些配置信息包括:html
经过查看这些配置信息,能够了解java进程的运行时环境,例如加载类的顺序、jvm配置状况等。java
举例来讲,咱们运行以下java程序安全
java -jar -Dtest test-1.0-SNAPSHOT.jar &oracle
其中配置了一个jvm命令行参数-Dtest,注意jvm命令行参数要再jar包前面,不然就成为了main函数的参数了。 使用jvm
jps -lm函数
查看进程id,这里获得的进程id是3107778,使用url
jinfo 3107778spa
打印进程的配置信息,包括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命令行参数
在日常的一些项目中,咱们会使用Properties来保存一些配置信息。一样在java自己也会用Properties来保存java平台的配置信息,这个就是java system properties。System properties主要包含了current user、the current version of the Java runtime、jvm加载的类的路径等信息。unix
这个Properties就在java.lang.System类中。能够经过查看代码看到System中有个props的属性,这个即是刚才提到的java system properties:
public final class System { //.... /** * System properties. The following properties are guaranteed to be defined: * <dl> * <dt>java.version <dd>Java version number * <dt>java.vendor <dd>Java vendor specific string * <dt>java.vendor.url <dd>Java vendor URL * <dt>java.home <dd>Java installation directory * <dt>java.class.version <dd>Java class version number * <dt>java.class.path <dd>Java classpath * <dt>os.name <dd>Operating System Name * <dt>os.arch <dd>Operating System Architecture * <dt>os.version <dd>Operating System Version * <dt>file.separator <dd>File separator ("/" on Unix) * <dt>path.separator <dd>Path separator (":" on Unix) * <dt>line.separator <dd>Line separator ("\n" on Unix) * <dt>user.name <dd>User account name * <dt>user.home <dd>User home directory * <dt>user.dir <dd>User's current working directory * </dl> */ 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")