jinfo介紹

1. jinfo

1.1 簡介

jinfo用於打印java的配置信息,這些配置信息包括:html

  • java system properties
  • jvm命令行參數

經過查看這些配置信息,能夠了解java進程的運行時環境,例如加載類的順序、jvm配置狀況等。java

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 &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命令行參數

2. java system properties

在日常的一些項目中,咱們會使用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")

3. 參考

  1. jinfo man page
  2. https://docs.oracle.com/javase/tutorial/essential/environment/sysprop.html
  3. https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html
相關文章
相關標籤/搜索