Java 啟動參數


啟動方式

java命令啟動Java程序,有兩種方式:

  • 通過指定入口類:java SomeClass。這里的SomeClassmain()方法所在的類。其一般格式為java [ options ] SomeClass[ arguments ]
  • 指定入口類所在jar包:java -jar SomeJar.jar。這里的SomeJar.jar是入口類所在的jar包。其一般格式為java [ options ] -jar SomeJar.jar [ arguments ]

在一般格式中:

  • [ options ]:配置 Java 的虛擬機選項(或稱 系統參數)
  • [ arguments ]:配置 Java 程序參數(或稱 運行參數)
    例如:java -Dfile.encoding=UTF-8 -Dusername=Joe Test hi a b c d

啟動參數的類型

在啟動Java程序時,可以指定兩類參數,分別叫做虛擬機選項(VM options)和程序參數(program arguments)。
虛擬機選項是指由JVM支持、用於設置虛擬機啟動過程的參數。
程序參數是指用戶自定義的參數,在代碼中可以通過main()方法的String[] args獲取。

虛擬機選項(VM options)

虛擬機選項分為3類,分別是:

  • 標准參數(-):所有的JVM實現都必須實現這些參數的功能,而且向后兼容。
  • 非標准參數(-X):默認JVM實現這些參數的功能,但是並不保證所有JVM實現都滿足,且不保證向后兼容。
  • 非Stable參數(-XX):此類參數各個JVM實現會有所不同,將來可能會隨時取消,需要慎重使用。

標准參數

標准參數是指以-開頭的參數。常見的標准參數如:

  • -client / -server: 指定虛擬機以client模式(Windows下的默認模式)還是server模式(Linux下的默認模式)啟動。
  • -jar:指定以jar包的形式執行一個應用程序。要這樣執行一個應用程序,必須讓jar包的manifest文件中聲明初始加載的Main-class,該類中必須有public static void main(String[] args)方法。
  • -verbose 或 -verbose:class:輸出JVM載入類的相關信息,當JVM報告說找不到類或者類沖突時可此進行診斷。
  • -verbose:gc:輸出每次GC的相關情況。
  • -verbose:jni:輸出native方法調用的相關情況,一般用於診斷jni調用錯誤信息。
  • -X:輸出非標准的參數列表及其描述。
  • -? 或 -help:輸出java標准參數列表及其描述。
  • -version:輸出java的版本信息,比如jdk版本、vendor、model。
  • -javaagent:jarpath[=options]:指定jvm啟動時裝入java語言設備代理。Jarpath文件中的mainfest文件必須有Agent-Class屬性,代理類必須實現方法public static void premain(String agentArgs, Instrumentation inst)(和main方法類似)。當JVM初始化時,將按代理類的說明順序調用premain方法。具體參見java.lang.instrument軟件包的描述。
  • -enableassertions[:"..." | : ] 或 -ea[:"..." | : ]:用來設置JVM是否啟動斷言機制(從JDK 1.4開始支持),缺省時JVM關閉斷言機制。
  • -disableassertions[:"..." | :<class ; ] 或 -da[:"..." | : ]:用來設置JVM關閉斷言處理,一般用於相同package內某些class不需要斷言的場景。
  • -enablesystemassertions 或 -esa:激活系統類的斷言。
  • -disablesystemassertions 或 -dsa:關閉系統類的斷言。

類加載路徑

JVM的類加載路徑通過-classpath <classpath>-cp <classpath>指定,多個路徑之間用分號分隔,如:

-classpath "D:\Program Files\Java\jdk1.8.0_231\jre\lib\charsets.jar;D:\Program Files\Java\jdk1.8.0_231\jre\lib\deploy.jar"

使用-classpath后,JVM 將不再使用CLASSPATH中的類加載路徑。(如果-classpathCLASSPATH都沒有設置,則JVM使用當前路徑(.)作為類加載路徑。)
JVM 搜索類的方式和順序為:

  1. Bootstrap:Bootstrap中的路徑是JVM自帶的jar或zip文件,JVM首先搜索這些包文件,用System.getProperty("sun.boot.class.path")可得到其值。
  2. Extension:Extension是位於JRE_HOME/lib/ext目錄下的jar文件,JVM在搜索完Bootstrap后就搜索該目錄下的jar文件,用System.getProperty("java.ext.dirs")可得到其值。
  3. User:User搜索順序為當前路徑、CLASSPATH-classpath。用System.getProperty("java.class.path")可得到其值。

在標准參數中,有一類以-D開頭定義的參數,叫做系統屬性參數,用於在虛擬機的系統屬性中設置屬性名/值對。

系統屬性參數

系統屬性參數以-D<propertyName>=value形式定義,運行在此虛擬機之上的應用程序可用System.getProperty("propertyName")得到value的值。
多個系統屬性參數之間用空格隔開。如果value中有空格,則需要用雙引號將該值括起來,如-Dname=”space string”。
參數可以是 Java 默認的,此類參數由 JVM 虛擬機自動識別並生效,例如-Dfile.encoding=UTF-8用於指定文件編碼格式;
也可以是用戶自定義的,例如-Dusername=Joe,程序中可以讀取該參數值,執行相關邏輯。
-Dspring.profiles.active=dev可以在SpringBoot啟動中指定系統變量,用於多環境(開發、測試、預發、線上)的區分。

關於標准參數更詳細的說明可以參看這篇文章

非標准參數

非標准參數又稱為擴展參數,是指以-X開頭的參數,可以通過java -X打印出所有的非標准參數。
常見的非標准參數如:

  • -Xms:指定JVM堆的初始大小(memory of start?),如-Xms3550m
  • -Xmx:指定JVM堆的最大值(memory of maximum?),如-Xmx3550m
  • -Xmn:指定JVM堆中新生代的大小(memory of nursery),如-Xmn2g
  • -Xss:設置單個線程棧的大小(stack size),一般默認為512k。等同於-XX:NewSize
  • -Xprof:跟蹤正運行的程序,並將跟蹤數據在標准輸出輸出;適合於開發環境調試。
  • -Xloggc: :與-verbose:gc功能類似,只是將每次GC事件的相關情況記錄到一個文件中。若與verbose命令同時出現在命令行中,則以-Xloggc為准。
  • -Xint:設置JVM以解釋模式運行,所有的字節碼將被直接執行,而不會編譯成本地碼。
    更詳細的說明可以參看這篇文章

非Stable參數

非Stable參數是指以-XX開頭的參數。
這類參數在JVM中可能是不健壯的,SUN也不推薦使用,后續可能會在沒有通知的情況下就直接取消了。
但這些參數中有些的確很有用,比如我們經常會見到的-XX:PermSize-XX:MaxPermSize
這些參數可以大致分成三類:

  • 行為參數(Behavioral Options):用於改變jvm的一些基礎行為
  • 性能調優(Performance Tuning):用於jvm的性能調優
  • 調試參數(Debugging Options):一般用於打開跟蹤、打印、輸出等jvm參數,用於顯示jvm更加詳細的信息
    更詳細的說明可以參看這篇文章

程序參數(program arguments)

用戶自定義的參數。在代碼中通過main()方法的String[] args獲取后,用戶在代碼中按約定的格式對其進行解析,得到所需的參數值。

最終,我們來看一個包含各類參數的java啟動命令:

java -jar -server -Xmx3550m -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintGCDetails -XX:+PrintGCDateStamps 
-Dserver.connection-timeout=60000 -Dspring.profiles.active=online SomeJar.jar argument1 argument2

參考文檔:

  1. java: Launches a Java application - Oracle官方文檔
  2. java啟動參數一【博客園】
  3. java -jar 啟動參數【CSDN】
  4. Java 設置系統參數和運行參數【CSDN】
  5. java程序啟動參數-D詳解【CSDN】
  6. JAVA啟動參數三:非Stable參數


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM