Java啓動命令大觀

Java啓動命令是所有java應用程序的入口,通過它來啓動Java運行時環境,並加載相關的class。不過由於IDE的盛行,我們Java程序員中的大多數並不是非常的瞭解Java啓動命令。本文希望做一個Java啓動命令的彙總,和各位同道分享,也便於日後作爲自己的參考。

Java啓動命令語法

Java啓動命令有兩個,java以及javaw,它們的唯一區別是javaw不會啓動一個控制檯窗口(啓動失敗的時候會彈出附有錯誤信息的窗口),而java會。不希望有控制檯的時候用javaw,其它時候用java。它們的語法結構都一樣,只需要記住其中一個即可。調用程序有兩種方式,指定Class以及指定jar文件,具體的語法如下:

  • java [options] class [arguments]

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

  • javaw [options] class [arguments]

  • javaw [options] -jar file.jar [arguments]

其中[options]表示Java運行環境的可選配置信息,會影響java運行環境,是性能調優的關鍵所在,可以傳多個選擇項。class表示的是包含main函數的class名稱(含包名)。-jar和file.jar配對使用,-jar指示用jar方式啓動,而file.jar表示的時jar文件的名稱,替換爲自己的jar文件名字即可。[arguments]表示的是程序自身的參數,會被傳到main函數的參數數組裏面,爲程序自己所使用。

Java啓動命令可選項(options)

Java啓動命令可選項(options)大致可分爲標準和非標準兩種,非標準的可選項不保證在所有平臺上都實現,並且未來的版本中可能會被修改且不告知,總之就是不穩定(Unstable)。不過有的非標準可選項還是非常有用的,後面我們會談到。

標準可選項(Standard options)

  • -client-server
    以clien或者server模式啓動,二選一,Java運行時環境會依場景來優化自己的配置策略。值得指出的是64位的Java不支持client模式,默認就是server。不同平臺的默認配置可以參考Server-Class Machine Detection

  • -cp-classpath
    最重要的可選項之一,指定Java運行時環境搜索class的路徑。-cp只是-classpath的簡寫,做相同的事情,用其中之一即可。多個路徑用英文裏面的分號分隔。如果-cp和-classpath都沒有使用,CLASSPATH環境變量也沒用設定,那麼就是當前路徑(.)。

  • -Dproperty=value
    設定系統屬性值,比如編碼-Dfile.encoding=UTF-8。可以設定一些系統使用的屬性,也可以用來向程序傳遞值,比如程序的根目錄。 可以通過System.getProperty("keyname")來獲取屬性。

  • -help-?
    都是要求顯示幫助信息

  • disableassertions[:packagename...|:classname]da[:packagename...|:classname]
    禁用斷言,可以指定包名(注意包後面的三個點)或者class的名稱。默認就是禁用的。da只是disableassertions的縮寫,使用方法完全一樣。 禁用包: da:org.slf4j...
    禁用類: da:org.slf4j.LoggerFactory

  • enableassertions[:packagename...|:classname]ea[:packagename...|:classname]
    啓用斷言,可以指定包名(注意包後面的三個點)或者class的名稱。ea只是enableassertions的縮寫,使用方法完全一樣。 啓用包: ea:org.slf4j...
    啓用類: ea:org.slf4j.LoggerFactory

  • disablesystemassertionsdsa
    禁用系統類(syetem class)斷言

  • enablesystemassertionsesa
    啓用系統類(syetem class)斷言

  • -version-showversion
    這兩個都顯示Java的版本信息,不過後者會把help的信息也顯示出來。

  • verbose:class, verbose:gc, "verbose:jni"
    verbose:class顯示class加載信息,verbose:gc顯示Java垃圾回收的信息。verbose:jni顯示JNI(Java Native Interface)信息。

  • -agentlib:agentlibname[=options]-agentpath:pathtoagent[=options]
    都是加載本地代理庫(Native Agent Library),-agentlib只需要library的名稱,且會根據不同的操作系統轉爲對應的文件(Windows爲DLL)。 -agentpath指定library的絕對路徑。

非標準可選項(Nonstandard Options)

非標準的可選項都以-X開始,其中的部分選項如下:

  • -X
    顯示所有非標準選項的信息。看看都有些什麼非標準選項吧。java -X

  • -Xms<size>
    設置Java堆的初始化大小。例如 -Xms1024m,Java堆的初始化大小就設置爲1G。

  • -Xmx<size>
    設置Java堆的最大值。例如 -Xmx3072m,Java堆的最大值就設置爲3G。

  • -Xss<size>
    設置Java線程棧的值。例如 -Xss128m,Java線程棧的值就設置爲128兆。

  • -Xnoclassgc
    禁用Java垃圾回收器。

  • -Xincgc
    啓用Java增量式垃圾回收器。

  • -Xmixed
    解釋模式和編譯模式混合執行

  • -Xint
    僅解釋模式執行

  • -Xshare:on-Xshare:off-Xshare:auto 設定類數據共享CDS(Class data sharing)是否開啓。-Xshare:on要求一定要用共享的類數據;-Xshare:auto表示讓系統自己判斷是否有類共享數據,有就用,沒有不用;-Xshare:off禁用共享類數據。

  • -Xcheck:jni
    針對JNI函數做額外的檢查

不穩定(Unstable)的選項

不穩定的選項當然是非標準的,都以-XX開頭。這一類參數有很多,暫時只列其中的幾個:

  • -XX:PermSize<=size>-XX:MaxPermSize<=size>
    設置Java永久保存區域(Permanent Generation Space)的大小。PermSize設置初始值,MaxPermSize設置最大值。 該區域主要存儲class的信息,且不會被垃圾回收器回收,如果加載的class過多,就會報錯:java.lang.OutOfMemoryError: PermGen space。 -XX:PermSize=64m -XX:MaxPermSize=128m,表示Java永久保存區域大小初始化爲64兆,最大爲128兆。

  • -XX:+UseParallelGC
    開啓並行Java回收器

  • -XX:+PrintGCDetails
    顯示比-verbose:gc更多更準確的垃圾回收信息

  • -XX:+TraceClassLoading
    顯示類加載以及卸載的信息

程序參數(arguments)

class或者jar文件之後的字符串會傳給main函數的String[] args參數,多個參數用空格隔開。如果某一個參數包含多個單詞,那麼需要用引號包起來。當有很多程序參數,且有的必填,有的可選的時候,如果不設計好,順序是很頭疼的問題。一種解法是傳鍵值對 (key=value),完全不用在意參數的順序。在main函數裏面把鍵值對解析成Map,然後再校驗以及使用。簡單的示例代碼如下:

public static void main(String[] args) {
		Map<String, String> arguments = getArguments(args);
		for (String key : arguments.keySet()) {
			System.out.println(key + "=" + arguments.get(key));
		}
	}

	public static Map<String, String> getArguments(String[] args) {
		Map<String, String> arguments = new HashMap<String, String>();

		if (args == null || args.length == 0) {
			return arguments;
		}

		for (String arg : args) {
			int index = arg.indexOf("=");
			// 沒有=,或者=是第一個,都出錯。
			if (index < 1) {
				throw new RuntimeException("param must be key value pair");
			}

			String key = arg.substring(0, index);
			String value = arg.substring(index + 1);
			arguments.put(key, value);
		}

		return arguments;
	}

 

參考鏈接


源自:http://blog.csdn.net/kimylrong/article/details/17339263

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章