1. 程式人生 > >Java命令列引數詳解

Java命令列引數詳解

最近在學習Gradle相關的知識。下載Gradle原始碼後,未能成功匯入IDEA執行。所以想另闢蹊徑,通過命令列來除錯執行Gradle程式。經過一番搜尋和思考。發現Java通過jdwp可以遠端除錯java程式的。在實踐的過程中,對一些命令列引數的含義不是特別清楚。故有此篇文章。

1. java命令 Oracle官方文件連結

java命令是用來啟動一個Java程式的。

2. 概覽

java [ options ] class [ arguments ]

java [ options ] -jar file.jar [ arguments ]

options

Command-line options. See Options.

class

The name of the class to be called.

file.jar

The name of the JAR file to be called. Used only with the -jar command.

arguments

The arguments passed to the main function.

3. 命令引數詳解

java命令通過啟動Java執行時環境,載入指定的類並呼叫該類的main方法來啟動一個Java應用程式
指定的class需要宣告一個main方法,格式如下:
public static
void main(String[] args)
如果java命令後面沒有option引數,那麼緊跟其後的第一個引數就是Class的全路徑二進位制名。例如 java com.test.Test。如果指定了-jar。那麼-jar後面跟的就是個包含了main方法的JAR檔案,例如 java -jar Test.jar
Java虛擬機器啟動的時候需要載入啟動類和其他需要用到的類。查詢的順序分別是啟動類路徑,擴充套件類路徑,以及使用者類路徑。可以通過java -verbose:class檢視類載入的順序

Options

當前的Java虛擬機器支援的Options分成Standard Options和NonStandard Options

1. Standard Options

-client
-server
兩種java虛擬機器的啟動方式,預設是用server模式
-agentlib:libname[=options]
載入Native agent library,舉例說明:
-agentlib:hprof dump堆疊
-agentlib:jdwp=help 命令列除錯幫助
-agentlib:hprof=help dump堆疊的幫助
-agentpath:pathname[=options]
通過library的全路徑名載入
-cp classpath
這個引數是用來指定類載入的路徑。可以指定一個或者多個目錄,JAR檔案,或者ZIP檔案,類載入會從指定的檔案中查詢。如果有多個檔案用:隔開

如果-classpath或-cp和CLASSPATH都沒有指定,那麼預設會從執行java命令的當前目錄查詢類


為了方便,我們還可以用萬用字元*來代替多個路徑

例如,如果目錄mydir包含a.jar和b.JAR,則類路徑元素mydir / *將擴充套件為A.jar:b.JAR,但不指定jar檔案的順序。列表中包含指定目錄中的所有jar檔案,包括隱藏的檔案。一個僅包含*的類路徑條目
展開為當前目錄中所有jar檔案的列表。定義的CLASSPATH環境變數將被類似地擴充套件。任何類路徑萬用字元擴充套件都在Java VM啟動之前發生。除了通過查詢環境外,沒有任何Java程式會看到沒有擴充套件的萬用字元。例如,通過呼叫System.getenv(“CLASSPATH”)。
-Dproperty=value
設定系統屬性.
-d32
-d64
在32位或64位模式下執行
-disableassertions[:package name”…” | :class name ]
-da[:package name”…” | :class name ]
禁用斷言
-enableassertions[:package name”…” | :class name ]
-ea[:package name”…” | :class name ]
開啟斷言
-verbose
-verbose:class
顯示類載入的資訊
-verbose:gc
列印GC資訊
-verbose:jni
列印jni相關資訊

2. NonStandard Options

-X
打印出NonStandard Options(非標準引數)的幫助資訊,並退出jvm
-Xint
讓虛擬機器只在解釋型模式下執行,不允許生成本地指令(就是禁用JIT)。有可能會損失效能
-Xbatch
禁止後臺編譯。通常jvm編譯方法是在後臺進行的。
-Xnoclassgc
禁止Class常量被垃圾回收器回收。有可能會導致OutOfMemoryError
-Xincgc
開啟增量垃圾回收。可以降低GC暫停時間
-Xloggc:file
列印GC log到指定檔案。和-verbose:gc一起使用
-Xmnsize or -XX:NewSize
指定年輕代的大小
-Xmsn
指定java堆的初始大小
例子:
-Xms6291456
-Xms6144k
-Xms6m
-Xmxn
指定java堆的最大大小
例子:
-Xmx83886080
-Xmx81920k
-Xmx80m
-Xprof
分析正在執行的程式,並將分析資料傳送到標準輸出。該選項作為一個在程式開發中很有用的實用程式提供,並不打算用於生產系統。
-Xssn
設定java執行緒棧大小
-Xverify:mode
是否校驗位元組碼格式。mode有如下三種
remote 預設方式。校驗所有非bootstrap class loader載入類的位元組碼
all 校驗所有的位元組碼
none 不校驗位元組碼。但是目前沒有支援
-XX:+|-DisableAttachMechanism
是否允許Java VM被命令attach。預設是關閉的。如果要開啟可以如下命令
java -XX:+DisableAttachMechanism
-XX:+|-FlightRecorder
效能分析工具。
-XXLargePageSizeInBytes=n

Specifies the maximum size for large pages.

-XX:MaxGCPauseMillis=n
設定最大的GC 暫停時間
-XX:NewSize
同-Xmnsize.
-XX:ParallelGCThreads=n
設定並行垃圾回收的執行緒數量
-XX:+UseConcMarkSweepGC or -XX:+UseG1GC
開啟Concurrent Mark Sweep (CMS) 或 G1 垃圾回收器.
-XX:+PrintGCDetails -XX:+PrintGCTimeStamps
列印帶時間戳的垃圾回收日誌

參考文章

  1. https://docs.oracle.com/javase/7/docs/technotes/tools/solaris/java.html#BGBJAAEH
  2. http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html