Java 在運行已編譯完成的類時,是通過 java 虛擬機器來裝載和執行的,java 虛擬機器通過操作
系統命令 JAVA_HOME\bin\java –option 來啟動,-option 為虛擬機器參數,JAVA_HOME 為JDK
安裝路徑,通過這些參數可對虛擬機器的運行狀態進行調整,掌握參數的含義可對虛擬機器的運
行模式有更深入理解。
一、 查看參數列表:
虛擬機器參數分為基本和擴充兩類,在命令列中輸入 JAVA_HOME\bin\java 就可得到基本參數
列表,
在命令列輸入 JAVA_HOME\bin\java –X 就可得到擴充參數列表。
二、 基本參數說明:
1. -client,-server
這兩個參數用於設定虛擬機器使用何種運行模式,client 模式啟動比較快,但運行時效能和
記憶體管理效率不如 server 模式,通常用於用戶端應用程式。相反,server 模式啟動比 client
慢,但可獲得更高的運行效能。
在 windows上,預設的虛擬機器類型為 client 模式,如果要使用 server模式,就需要在啟動
虛擬機器時加-server 參數,以獲得更高效能,對伺服器端應用,推薦採用 server 模式,尤
其是多個 CPU 的系統。在 Linux,Solaris 上預設採用 server模式。
2. -hotspot
含義與 client 相同,jdk1.4 以前使用的參數,jdk1.4 開始不再使用,代之以 client。
3. -classpath,-cp
虛擬機器在運行一個類時,需要將其裝入記憶體,虛擬機器搜尋類的方式和順序如下:
Bootstrap classes,Extension classes,User classes。
Bootstrap 中的路徑是虛擬機器內建的 jar 或 zip 檔案,虛擬機器首先搜尋這些包檔案,用
System.getProperty("sun.boot.class.path")可得到虛擬機器搜尋的包名。
Extension 是位於 jre\lib\ext 目錄下的 jar 檔案,虛擬機器在搜尋完 Bootstrap 後就搜尋該
目錄下的 jar 檔案。用 System. getProperty("java.ext.dirs”)可得到虛擬機器使用
Extension 搜尋路徑。
User classes 搜尋順序為目前的目錄、環境變數 CLASSPATH、-classpath。
4. -classpath
告知虛擬機器搜尋目錄名、jar 文檔名、zip 文檔名,之間用分號;分隔。
例如當你自己開發了公用類並封裝成一個 common.jar 包,在使用 common.jar 中的類時,就
需要用-classpath common.jar 告訴虛擬機器從 common.jar 中尋找該類,否則虛擬機器就會拋
出 java.lang.NoClassDefFoundError異常,表明未找到類定義。
在運行時可用 System.getProperty(“java.class.path”)得到虛擬機器尋找類的路徑。
使用-classpath 後虛擬機器將不再使用 CLASSPATH 中的類搜尋路徑,如果-classpath 和
CLASSPATH 都沒有設定,則虛擬機器使用當前路徑(.)作為類搜尋路徑。
推薦使用-classpath 來定義虛擬機器要搜尋的類路徑,而不要使用環境變數 CLASSPATH 的搜
索路徑,以減少多重專案同時使用 CLASSPATH 時存在的潛在衝突。例如應用 1 要使用
a1.0.jar 中的類 G,應用 2 要使用 a2.0.jar 中的類 G,a2.0.jar 是 a1.0.jar 的升級包,當
a1.0.jar,a2.0.jar 都在 CLASSPATH 中,虛擬機器搜尋到第一個包中的類 G 時就停止搜尋,
如果應用1應用2的虛擬機器都從CLASSPATH中搜尋,就會有一個應用得不到正確版本的類G。
5. -D<propertyName>=value
在虛擬機器的系統屬性中設定屬性名稱/值對,運行在此虛擬機器之上的應用程式可用
當虛擬機器報告類找不到或類衝突時可用此參數來診斷來查看虛擬機器從裝入類的情況。
7. -verbose:gc
在虛擬機器發生記憶體回收時在輸出裝置顯示資訊,格式如下:
[Full GC 268K->168K(1984K), 0.0187390 secs]
該參數用來監視虛擬機器記憶體回收的情況。
8. -verbose:jni
在虛擬機器調用 native 方法時輸出裝置顯示資訊,格式如下:
[Dynamic-linking native method HelloNative.sum ... JNI]
該參數用來監視虛擬機器調用本地方法的情況,在發生 jni錯誤時可為診斷提供便利。
9. -version
顯示可啟動並執行虛擬機器版本資訊然後退出。一台機器上裝有不同版本的 JDK 時
10. -showversion
顯示版本資訊以及協助資訊。
11. -ea[:<packagename>...|:<classname>]
12. -enableassertions[:<packagename>...|:<classname>]
從 JDK1.4 開始,java 可支援斷言機制,用於診斷運行時問題。通常在測試階段使斷言有效,
在正式運行時不需要運行斷言。斷言後的運算式的值是一個邏輯值,為 true 時斷言不運行,
為 false 時斷言運行,拋出 java.lang.AssertionError 錯誤。
上述參數就用來設定虛擬機器是否啟動斷言機制,預設時虛擬機器關閉斷言機制,用-ea 可開啟
斷言機制,不加<packagename>和 classname 時運行所有包和類中的斷言,如果希望只運行
某些包或類中的斷言,可將包名或類名加到-ea 之後。例如要啟動包 com.foo.util 中的斷
言,可用命令 –ea:com.foo.util 。
13. -da[:<packagename>...|:<classname>]
14. -disableassertions[:<packagename>...|:<classname>]
用來設定虛擬機器關閉斷言處理,packagename和classname 的使用方法和-ea 相同。
15. -esa | -enablesystemassertions
設定虛擬機器顯示系統類的斷言。
16. -dsa | -disablesystemassertions
設定虛擬機器關閉系統類別的斷言。
17. -agentlib:<libname>[=<options>]
該參數是 JDK5 新引入的,用於虛擬機器裝載本地代理庫。
Libname 為本地代理庫檔案名稱,虛擬機器的搜尋路徑為環境變數 PATH 中的路徑,options 為傳
給本地庫啟動時的參數,多個參數之間用逗號分隔。在 Windows 平台上虛擬機器搜尋本地庫名
為 libname.dll 的檔案,在 Unix 上虛擬機器搜尋本地庫名為 libname.so 的檔案,搜尋路徑環
境變數在不同系統上有所不同,Linux、SunOS、IRIX上為LD_LIBRARY_PATH,AIX上為LIBPATH,
HP-UX 上為SHLIB_PATH