1. javac 指令
用法:javac <options> <source files> <@files>
source files: 一個或多個要編譯的源檔案(.java檔案)
@files:一個或多個 包含待編譯.java檔案清單 的檔案。
注:當要編譯的.java檔案較少,直接在javac指令後接上源檔案清單即可,例如:javac SourceFile1.java SourceFile2.java 當要編譯的Java檔案較多時可以使用*.java通配,也可以将源檔案名列在一個檔案中(任意字尾均可,例如:sourcefiles.anything),然後在 javac 指令行中使用該清單檔案名,檔案名前冠以 @ 字元,即:javac @sourcefiles.anything
options:編譯選項/參數
- -g 生成所有調試資訊
- -g:none 不生成任何調試資訊
- -g:{lines,vars,source} 隻生成某些調試資訊
- -nowarn 不生成任何警告
- -verbose 輸出有關編譯器正在執行的操作的消息
- -deprecation 輸出使用已過時的 API 的源位置
- -classpath <路徑> 指定查找使用者類檔案和注釋處理程式的位置
- -cp <路徑> 指定查找使用者類檔案和注釋處理程式的位置
- -sourcepath <路徑> 指定查找輸入源檔案的位置
- -bootclasspath <路徑> 覆寫引導類檔案的位置
- -extdirs <目錄> 覆寫所安裝擴充的位置
- -endorseddirs <目錄> 覆寫簽名的标準路徑的位置
- -proc:{none,only} 控制是否執行注釋處理和/或編譯。
- -processor <class1>[,<class2>,<class3>...] 要運作的注釋處理程式的名稱; 繞過預設的搜尋程序
- -processorpath <路徑> 指定查找注釋處理程式的位置
- -parameters 生成中繼資料以用于方法參數的反射
- -d <目錄> 指定放置生成的類檔案的位置
- -s <目錄> 指定放置生成的源檔案的位置
- -h <目錄> 指定放置生成的本機标頭檔案的位置
- -implicit:{none,class} 指定是否為隐式引用檔案生成類檔案
- -encoding <編碼> 指定源檔案使用的字元編碼
- -source <發行版> 提供與指定發行版的源相容性
- -target <發行版> 生成特定 VM 版本的類檔案
- -profile <配置檔案> 請確定使用的 API 在指定的配置檔案中可用
- -version 版本資訊
- -help 輸出标準選項的提要
- -A關鍵字[=值] 傳遞給注釋處理程式的選項
- -X 輸出非标準選項的提要
- -J<标記> 直接将 <标記> 傳遞給運作時系統
- -Werror 出現警告時終止編譯
- @<檔案名> 從檔案讀取選項和檔案名
這裡我們挑幾個常用的option詳細介紹一下:
1.1 -d
指定放置生成的類檔案的位置,eg:javac -d <destdir> Xxx.java。預設情況下class檔案和源檔案存放同一級目錄,不會自動建包結構的檔案夾存放生成的class檔案。當指定了<destdir>時,如果編譯的類帶有包名的話會自動把包建好。<destdir>必須存在,不會自動建立不存在的指定路徑,否則報錯如下:javac: 找不到目錄: <destdir>
1.2 -classpath/-cp
設定使用者類路徑,它将覆寫CLASSPATH 環境變量中的使用者類路徑。若預設則預設目前路徑。
1.3 -sourcepath
指定用以查找類或接口定義的源代碼路徑。與使用者類路徑一樣,源路徑項用分号 (:) 進行分隔,它們可以是目錄、JAR 歸檔檔案或 ZIP 歸檔檔案。如果使用包,那麼目錄或歸檔檔案中的本地路徑名必須反映包名。通過類路徑查找的類,如果找到了其源檔案,則可能會自動被重新編譯。
注意:在javac指令中-classpath和-sourcepath都是用于指定編譯目前類檔案 需要的調用其他路徑上的類或源檔案 的位置。
可以這麼了解:
- -classpath用來指定搜尋類檔案(*.class檔案)的路徑,-sourcepath用來指定搜尋源檔案(*.java檔案)的路徑
- 如果未指定-sourcepath,将會在classpath指定的路徑中查找類檔案(*.class檔案)和源檔案(*.java檔案)。如果指定了sourcepath則不會在classpath路徑下查找源檔案。
- 如果找到了源檔案(*.java檔案),可能會重新生成類檔案(*.class檔案)
下面我們來測試一下:
在D盤根目錄下建立一個Test類和Hello類:
// D
// |——Test.java
// |——Hello.java
package fu.zhi.zhe;
public class Test{
public static void main(String[] args){
Hello hello = new Hello();
hello.sayHello();
}
}
package fu.zhi.zhe;
public class Hello{
public void sayHello(){
System.out.println("Hello");
}
}
1.3.1 首先我們不使用-classpath和-sourcepath參數
C:\> javac -d d:\classes -verbose D:\Test.java
首先我們會發現這是編譯不通過的,報錯資訊提示找不到類Hello。為什麼會出現這一情況呢,原因在于此時Hello類和Test類都在D盤根目錄下,當我們使用C:\> javac -d d:\classes -verbose D:\Test.java 指令編譯Test類時由于我們既沒有指定-classpath參數也沒有指定-sourcepath參數,而-classpath預設時表示目前路徑即C:\,顯然這個路徑下是找不到Hello.java的。參見編譯器輸出的詳細資訊:
[源檔案的搜尋路徑: .]
[類檔案的搜尋路徑: C:\Program Files\Java\jdk1.8.0_221\jre\lib\resources.jar,C:\Program Files\Java\jdk1.8.0_221\jre\lib\rt.jar,C:\Program Files\Java\jdk1.8.0_221\jre\lib\sunrsasign.jar,C:\Program Files\Java\jdk1.8.0_221\jre\lib\jsse.jar,C:\Program Files\Java\jdk1.8.0_221\jre\lib\jce.jar,C:\Program Files\Java\jdk1.8.0_221\jre\lib\charsets.jar,C:\Program Files\Java\jdk1.8.0_221\jre\lib\jfr.jar,C:\Program Files\Java\jdk1.8.0_221\jre\classes,C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\access-bridge-64.jar,C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\cldrdata.jar,C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\dnsns.jar,C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\jaccess.jar,C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\jfxrt.jar,C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\localedata.jar,C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\nashorn.jar,C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunec.jar,C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunjce_provider.jar,C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunmscapi.jar,C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunpkcs11.jar,C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\zipfs.jar,.]
那麼如果我們切換到D盤目錄下或者指定sourcepath或classpath為D:\,編譯能成功嗎?其實無論是切換到D盤還是設定classpath或sourcapath,javac編譯器依然找不到Hello類?其實是這樣的,因為在我們Test類中引入了Hello類,編譯器尋找帶包的類是會帶上包名作為目錄結構去找的,也就是他回去找D:\fu\zhi\zhe\下有沒有Hello類,此時當然找不到了。如果我們把放在D:\目錄下的Hello類移動到D:\fu\zhi\zhe包下,就可以編譯成功了。
注意:我們在編譯Test類時并沒有加上包名來編譯這個源檔案,加上源檔案的全路徑名就行了即D:\Hello.java,這一點要和java指令區分開來。java指令在執行時是需要帶上包名的,并且包之間用.分割。D:\>java fu.zhi.zhe.Hello。
測試過程中我發現一個有意思的問題,一開始我忘記給Hello類加上包名,此時無論如何都是編譯不通過的。查了以後才知道jdk1.4以後就不允許帶包的類引用不帶包的類了。但如果真的一定要用也不是沒有辦法的,隻要把待引入的類提前編譯好,添加到java指令的-classpath路徑下,就可以反射調用這個類了。哈哈哈,反射技術絕對是Java中出的叛徒。
首先我們修改一下Hello.java如下:
這是一個不帶包結構的類,怎麼在Test類中引入呢?首先編譯Hello類:javac -d D:\classes Hello.java,生成位元組碼檔案放在D:\classes檔案夾下。然後修改Test類如下:public class Hello{ public void sayHello(){ System.out.println("Hello"); } }
此時我們再編譯Test.java如下:javac -d D:\ Test.java,生成Test.class檔案在D:\fu\zhi\zhe檔案夾下。兩個類都編譯完成可以執行了,此時在DOS視窗輸入D:\> java -verbose -classpath D:\classes;. fu.zhi.zhe.Test就可以執行成功列印Hello啦,并且可以看到Hello類被加載。事實上,這個類其實是被ApplicationClassLoader類加載器加載的,其實我們也可以使用BootStrap ClassLoader和Extension ClassLoader加載Hello類,這個将在後文介紹。package fu.zhi.zhe; import java.lang.reflect Method; public class Test{ public void sayHello(){ try{ Class<?> helloCls = class.forName("Hello"); Object hello = helloCls.newInstance(); Method sayHelloMtd = helloCls.getMethod("sayHello"); sayHelloMtd.invoke(hello); } catch(Exception e){ e.printStackTrace(); } } }
1.3.2 同時指定-classpath和-sourcepath執行
C:\Users\hp>javac -verbose -classpath D:\apps -sourcepath D:\ D:\Test.java
[解析開始時間 RegularFileObject[D:\Test.java]]
[解析已完成, 用時 16 毫秒]
[源檔案的搜尋路徑: D:\]
[類檔案的搜尋路徑:
C:\Program Files\Java\jdk1.8.0_221\jre\lib\resources.jar,
C:\Program Files\Java\jdk1.8.0_221\jre\lib\rt.jar,
C:\Program Files\Java\jdk1.8.0_221\jre\lib\sunrsasign.jar,
C:\Program Files\Java\jdk1.8.0_221\jre\lib\jsse.jar,
C:\Program Files\Java\jdk1.8.0_221\jre\lib\jce.jar,
C:\Program Files\Java\jdk1.8.0_221\jre\lib\charsets.jar,
C:\Program Files\Java\jdk1.8.0_221\jre\lib\jfr.jar,
C:\Program Files\Java\jdk1.8.0_221\jre\classes,
C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\access-bridge-64.jar,
C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\cldrdata.jar,
C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\dnsns.jar,
C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\jaccess.jar,
C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\jfxrt.jar,
C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\localedata.jar,
C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\nashorn.jar,
C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunec.jar,
C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunjce_provider.jar,
C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunmscapi.jar,
C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunpkcs11.jar,
C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\zipfs.jar,
D:\apps
]
...
[正在加載RegularFileObject[D:\fu\zhi\zhe\Hello.java]]
可以看到明确指定了源檔案搜尋路徑為指定的-sourcepath 即 D:\,而類檔案搜尋路徑除了啟動類加載器和擴充類加載器的路徑外還加上了指定的-classpath 即 D:\apps。
1.3.3 隻指定classpath-執行
C:\Users\hp>javac -verbose -classpath D:\ D:\Test.java
[解析開始時間 RegularFileObject[D:\Test.java]]
[解析已完成, 用時 16 毫秒]
[源檔案的搜尋路徑: D:\]
[類檔案的搜尋路徑:
C:\Program Files\Java\jdk1.8.0_221\jre\lib\resources.jar,
C:\Program Files\Java\jdk1.8.0_221\jre\lib\rt.jar,
C:\Program Files\Java\jdk1.8.0_221\jre\lib\sunrsasign.jar,
C:\Program Files\Java\jdk1.8.0_221\jre\lib\jsse.jar,
C:\Program Files\Java\jdk1.8.0_221\jre\lib\jce.jar,
C:\Program Files\Java\jdk1.8.0_221\jre\lib\charsets.jar,
C:\Program Files\Java\jdk1.8.0_221\jre\lib\jfr.jar,
C:\Program Files\Java\jdk1.8.0_221\jre\classes,
C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\access-bridge-64.jar,
C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\cldrdata.jar,
C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\dnsns.jar,
C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\jaccess.jar,
C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\jfxrt.jar,
C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\localedata.jar,
C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\nashorn.jar,
C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunec.jar,
C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunjce_provider.jar,
C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunmscapi.jar,
C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunpkcs11.jar,
C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\zipfs.jar,
D:\]
...
[正在加載RegularFileObject[D:\fu\zhi\zhe\Hello.java]]
此時源檔案和類檔案的搜尋路徑就是一樣的了,都是按照-classpath指定的路徑D:\去查找。
1.3.4 隻指定-resourcepath執行
C:>javac -verbose -sourcepath D:\ D:\Test.java
[源檔案的搜尋路徑: D:\]
[類檔案的搜尋路徑:
C:\Program Files\Java\jdk1.8.0_221\jre\lib\resources.jar,
C:\Program Files\Java\jdk1.8.0_221\jre\lib\rt.jar,
C:\Program Files\Java\jdk1.8.0_221\jre\lib\sunrsasign.jar,
C:\Program Files\Java\jdk1.8.0_221\jre\lib\jsse.jar,
C:\Program Files\Java\jdk1.8.0_221\jre\lib\jce.jar,
C:\Program Files\Java\jdk1.8.0_221\jre\lib\charsets.jar,
C:\Program Files\Java\jdk1.8.0_221\jre\lib\jfr.jar,
C:\Program Files\Java\jdk1.8.0_221\jre\classes,
C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\access-bridge-64.jar,
C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\cldrdata.jar,
C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\dnsns.jar,
C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\jaccess.jar,
C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\jfxrt.jar,
C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\localedata.jar,
C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\nashorn.jar,
C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunec.jar,
C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunjce_provider.jar,
C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunmscapi.jar,
C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunpkcs11.jar,
C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\zipfs.jar,
.]
...
[正在加載RegularFileObject[D:\fu\zhi\zhe\Hello.java]]
此時類檔案的搜尋路徑因為預設即目前目錄,源檔案路徑即我們指定的路徑。
2.java 指令詳解
用法:
java [-options] class [args...] (執行類)
or
java [-options] -jar jarfile [args...] (執行jar檔案)
java指令支援的options分為standoptions和nonstandoptions,事實上javac也支援nonstandoptions但是用的較少上文并未列出。java指令的nonstandoptions多餘jvm調優相關。
2.1 java [-options] class [args...] (執行類)
2.1.1. stand options
-d32 使用 32 位資料模型 (如果可用)
-d64 使用 64 位資料模型 (如果可用)
-server 選擇 "server" VM,預設 VM 是 server.
-cp <目錄和 zip/jar 檔案的類搜尋路徑>
-classpath <目錄和 zip/jar 檔案的類搜尋路徑> 用 ; 分隔的目錄, JAR 檔案和 ZIP 檔案清單, 用于搜尋類檔案。
-D<名稱>=<值> 設定系統屬性
-verbose:[class|gc|jni] 啟用詳細輸出
-version 輸出産品版本并退出
-showversion 輸出産品版本并繼續
-? -help 輸出此幫助消息
-X 輸出非标準選項的幫助
-ea[:<packagename>...|:<classname>]
-enableassertions[:<packagename>...|:<classname>]
按指定的粒度啟用斷言
-da[:<packagename>...|:<classname>]
-disableassertions[:<packagename>...|:<classname>]
禁用具有指定粒度的斷言
-esa | -enablesystemassertions
啟用系統斷言
-dsa | -disablesystemassertions
禁用系統斷言
-agentlib:<libname>[=<選項>]
加載本機代理庫 <libname>, 例如 -agentlib:hprof
另請參閱 -agentlib:jdwp=help 和 -agentlib:hprof=help
-agentpath:<pathname>[=<選項>]
按完整路徑名加載本機代理庫
-javaagent:<jarpath>[=<選項>]
加載 Java 程式設計語言代理, 請參閱 java.lang.instrument
-splash:<imagepath>
使用指定的圖像顯示啟動螢幕
2.1.1.1 -cp/-classpath 設定類加載路徑
我們知道,Java中有三個不同的類加載器 Bootstrap ClassLoader(啟動類加載器,由C++實作,在Java中擷取其值以null表示),負責加載<JAVA_HOME>\jre\lib目錄下jar包中的類;Extension ClassLoader(擴充類加載器,Java代碼實作sun.misc.Launcher$ExtClassLoader),負責加載<JAVA_HOME>\jre\lib\ext目錄下的類;和Application ClassLoader(應用程式類加載器,也叫系統類加載器。Java代碼實作sun.misc.Launcher$AppClassLoader),負責加載classpath下的類,我們設定classpath更改的就是AppClassLoader類加載器的加載路徑。
bootstrap classloader類加載路徑,System.getProperty("sun.boot.class.path"):
C:\Program Files\Java\jdk1.8.0_221\jre\lib\resources.jar;
C:\Program Files\Java\jdk1.8.0_221\jre\lib\rt.jar;
C:\Program Files\Java\jdk1.8.0_221\jre\lib\sunrsasign.jar;
C:\Program Files\Java\jdk1.8.0_221\jre\lib\jsse.jar;
C:\Program Files\Java\jdk1.8.0_221\jre\lib\jce.jar;
C:\Program Files\Java\jdk1.8.0_221\jre\lib\charsets.jar;
C:\Program Files\Java\jdk1.8.0_221\jre\lib\jfr.jar;
C:\Program Files\Java\jdk1.8.0_221\jre\classes // 這個目錄預設不存在的,我們可以手動建立,這樣就可以實作啟動類加載器家在我們自己的類了
extension classloader類加載路徑,System.getProperty("java.ext.dirs"):
C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\access-bridge-64.jar
C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\cldrdata.jar
C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\dnsns.jar
C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\jaccess.jar
C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\jfxrt.jar
C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\localedata.jar
C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\nashorn.jar
C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunec.jar
C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunjce_provider.jar
C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunmscapi.jar
C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunpkcs11.jar
C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\zipfs.jar
2.1.1.2 -D<名稱>=<值>
設定系統變量,eg: -Djava.ext.dirs=D:\
什麼是系統屬性呢,具體到代碼上來說就是System類中定義的一系列鍵值對,System類中幾個常用的系統屬性相關方法:System::setProperty(), System::getProperty() ,System::getProperties() 。使用System.getProperties().list(System.out)列印一下我的系統屬性清單:
java.runtime.name=Java(TM) SE Runtime Environment
sun.boot.library.path=C:\Program Files\Java\jdk1.8.0_221\jre\bin
java.vm.version=25.221-b11
java.vm.vendor=Oracle Corporation
java.vendor.url=http://java.oracle.com/
path.separator=;
java.vm.name=Java HotSpot(TM) 64-Bit Server VM
file.encoding.pkg=sun.io
user.script=
user.country=CN
sun.java.launcher=SUN_STANDARD
sun.os.patch.level=
java.vm.specification.name=Java Virtual Machine Specification
user.dir=D:\IdeaProject\concurrency
java.runtime.version=1.8.0_221-b11
java.awt.graphicsenv=sun.awt.Win32GraphicsEnvironment
java.endorsed.dirs=C:\Program Files\Java\jdk1.8.0_221\jr...
os.arch=amd64
java.io.tmpdir=C:\Users\hp\AppData\Local\Temp\
line.separator=
java.vm.specification.vendor=Oracle Corporation
user.variant=
os.name=Windows 10
sun.jnu.encoding=GBK
java.library.path=C:\Program Files\Java\jdk1.8.0_221\bi...
java.specification.name=Java Platform API Specification
java.class.version=52.0
sun.management.compiler=HotSpot 64-Bit Tiered Compilers
os.version=10.0
user.home=C:\Users\hp
user.timezone=
java.awt.printerjob=sun.awt.windows.WPrinterJob
file.encoding=UTF-8
java.specification.version=1.8
user.name=hp
java.class.path=.
java.vm.specification.version=1.8
sun.arch.data.model=64
java.home=C:\Program Files\Java\jdk1.8.0_221\jre
sun.java.command=com.fuzz.jmm.ClassLoaderTest2
java.specification.vendor=Oracle Corporation
user.language=zh
awt.toolkit=sun.awt.windows.WToolkit
java.vm.info=mixed mode
java.version=1.8.0_221
java.ext.dirs=C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext;C:\WINDOWS\Sun\Java\lib\ext
sun.boot.class.path=
"C:\Program Files\Java\jdk1.8.0_221\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\rt.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\sunrsasign.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_221\jre\classes"
java.vendor=Oracle Corporation
file.separator=\
java.vendor.url.bug=http://bugreport.sun.com/bugreport/
sun.cpu.endian=little
sun.io.unicode.encoding=UnicodeLittle
sun.desktop=windows
sun.cpu.isalist=amd64
除了以上這些标準的系統屬性外我們還可以添加一些自定義的系統屬性。以上這些都是标準的系統屬性,其中有三個和類加載路徑相關的我們可以拿出來詳細讨論一下。
2.1.1.2.1 sun.boot.class.path
看他的值我們就知道,指定的是啟動類的類加載路徑。我們嘗試改一下:-Dsun.boot.class.path=D:\。執行報錯如下:"Error occurred during initialization of VM java/lang/ClassFormatError: Missing BootstrapMethods attribute in class file java/lang/CharSequence"。
2.1.1.2.2 java.ext.dirs
設定擴充類加載器的類加載路徑,-Djava.ext.dirs=<目錄>,會覆寫原來的值一般不用。
2.1.1.2.3 java.class.path
設定classpath。-Djava.class.path等效于-classpath
2.1.2 nonstand options
2.1.2.1 第一類非标準選項:-X開頭
-Xmixed 混合模式執行 (預設)
-Xint 僅解釋模式執行
-Xbootclasspath:<用 ; 分隔的目錄和 zip/jar 檔案>
設定搜尋路徑以引導類和資源
-Xbootclasspath/a:<用 ; 分隔的目錄和 zip/jar 檔案>
附加在引導類路徑末尾
-Xbootclasspath/p:<用 ; 分隔的目錄和 zip/jar 檔案>
置于引導類路徑之前
-Xdiag 顯示附加診斷消息
-Xnoclassgc 禁用類垃圾收集
-Xincgc 啟用增量垃圾收集
-Xloggc:<file> 将 GC 狀态記錄在檔案中 (帶時間戳)
-Xbatch 禁用背景編譯
-Xms<size> 設定初始 Java 堆大小
-Xmx<size> 設定最大 Java 堆大小
-Xss<size> 設定 Java 線程堆棧大小
-Xprof 輸出 cpu 配置檔案資料
-Xfuture 啟用最嚴格的檢查, 預期将來的預設值
-Xrs 減少 Java/VM 對作業系統信号的使用 (請參閱文檔)
-Xcheck:jni 對 JNI 函數執行其他檢查
-Xshare:off 不嘗試使用共享類資料
-Xshare:auto 在可能的情況下使用共享類資料 (預設)
-Xshare:on 要求使用共享類資料, 否則将失敗。
-XshowSettings 顯示所有設定并繼續
-XshowSettings:all
顯示所有設定并繼續
-XshowSettings:vm 顯示所有與 vm 相關的設定并繼續
-XshowSettings:properties
顯示所有屬性設定并繼續
-XshowSettings:locale
顯示所有與區域設定相關的設定并繼續
2.1.2.1.1 -Xbootclasspath:
-Xbootclasspath: 完全取代基本核心的Java class 搜尋路徑.不常用,否則要重新寫所有Java 核心class。作用類似于-Dsun.boot.class.path
2.1.2.1.2 -Xbootclasspath/p:
-Xbootclasspath/p: 字首。将classpath添加在核心class搜尋路徑前面.不常用,避免引起不必要的沖突.
2.1.2.1.3 -Xbootclasspath/a:
-Xbootclasspath/a: 字尾。将classpath添加在核心class搜尋-路徑後面。常用!!
注:這幾個指令後面的冒号不可省略,而且冒号後不要加空格。
2.1.2.2 第二類非标準選項,-XX:開頭
我們可以使用下面兩個參數來擷取所有的XX參數和值:
-XX:+PrintFlagsFinal or -XX:+PrintFlagsInitial
注意:
-XX:+PrintFlagsFinal 列印JVM參數的初始值
-XX:+PrintFlagsFinal 列印JVM啟動後的最終值 :"="表示值沒有别修改過,":="表示運作時被修改過的
如何檢視某個在運作的Java程式它的某個JVM參數是否開啟:
1. jinfo -flag 配置項 程序PID eg: jinfo -flag UseParallelGC 1234
我們也可以把輸出的值導入到一個txt檔案中:java -XX:+PrintFlagsFinal>>XXoptions.txt
本機測試結果發現XX參數共計728個。
[Global flags]
intx ActiveProcessorCount = -1 {product}
uintx AdaptiveSizeDecrementScaleFactor = 4 {product}
uintx AdaptiveSizeMajorGCDecayTimeScale = 10 {product}
uintx AdaptiveSizePausePolicy = 0 {product}
uintx AdaptiveSizePolicyCollectionCostMargin = 50 {product}
uintx AdaptiveSizePolicyInitializingSteps = 20 {product}
uintx AdaptiveSizePolicyOutputInterval = 0 {product}
uintx AdaptiveSizePolicyWeight = 10 {product}
uintx AdaptiveSizeThroughPutPolicy = 0 {product}
uintx AdaptiveTimeWeight = 25 {product}
bool AdjustConcurrency = false {product}
bool AggressiveHeap = false {product}
bool AggressiveOpts = false {product}
intx AliasLevel = 3 {C2 product}
bool AlignVector = false {C2 product}
intx AllocateInstancePrefetchLines = 1 {product}
intx AllocatePrefetchDistance = 192 {product}
intx AllocatePrefetchInstr = 3 {product}
intx AllocatePrefetchLines = 4 {product}
intx AllocatePrefetchStepSize = 64 {product}
intx AllocatePrefetchStyle = 1 {product}
bool AllowJNIEnvProxy = false {product}
bool AllowNonVirtualCalls = false {product}
bool AllowParallelDefineClass = false {product}
bool AllowUserSignalHandlers = false {product}
bool AlwaysActAsServerClassMachine = false {product}
bool AlwaysCompileLoopMethods = false {product}
bool AlwaysLockClassLoader = false {product}
bool AlwaysPreTouch = false {product}
bool AlwaysRestoreFPU = false {product}
bool AlwaysTenure = false {product}
bool AssertOnSuspendWaitFailure = false {product}
bool AssumeMP = false {product}
intx AutoBoxCacheMax = 128 {C2 product}
uintx AutoGCSelectPauseMillis = 5000 {product}
intx BCEATraceLevel = 0 {product}
intx BackEdgeThreshold = 100000 {pd product}
bool BackgroundCompilation = true {pd product}
uintx BaseFootPrintEstimate = 268435456 {product}
intx BiasedLockingBulkRebiasThreshold = 20 {product}
intx BiasedLockingBulkRevokeThreshold = 40 {product}
intx BiasedLockingDecayTime = 25000 {product}
intx BiasedLockingStartupDelay = 4000 {product}
bool BindGCTaskThreadsToCPUs = false {product}
bool BlockLayoutByFrequency = true {C2 product}
intx BlockLayoutMinDiamondPercentage = 20 {C2 product}
bool BlockLayoutRotateLoops = true {C2 product}
bool BranchOnRegister = false {C2 product}
bool BytecodeVerificationLocal = false {product}
bool BytecodeVerificationRemote = true {product}
bool C1OptimizeVirtualCallProfiling = true {C1 product}
bool C1ProfileBranches = true {C1 product}
bool C1ProfileCalls = true {C1 product}
bool C1ProfileCheckcasts = true {C1 product}
bool C1ProfileInlinedCalls = true {C1 product}
bool C1ProfileVirtualCalls = true {C1 product}
bool C1UpdateMethodData = true {C1 product}
intx CICompilerCount := 4 {product}
bool CICompilerCountPerCPU = true {product}
bool CITime = false {product}
bool CMSAbortSemantics = false {product}
uintx CMSAbortablePrecleanMinWorkPerIteration = 100 {product}
intx CMSAbortablePrecleanWaitMillis = 100 {manageable}
uintx CMSBitMapYieldQuantum = 10485760 {product}
uintx CMSBootstrapOccupancy = 50 {product}
bool CMSClassUnloadingEnabled = true {product}
uintx CMSClassUnloadingMaxInterval = 0 {product}
bool CMSCleanOnEnter = true {product}
bool CMSCompactWhenClearAllSoftRefs = true {product}
uintx CMSConcMarkMultiple = 32 {product}
bool CMSConcurrentMTEnabled = true {product}
uintx CMSCoordinatorYieldSleepCount = 10 {product}
bool CMSDumpAtPromotionFailure = false {product}
bool CMSEdenChunksRecordAlways = true {product}
uintx CMSExpAvgFactor = 50 {product}
bool CMSExtrapolateSweep = false {product}
uintx CMSFullGCsBeforeCompaction = 0 {product}
uintx CMSIncrementalDutyCycle = 10 {product}
uintx CMSIncrementalDutyCycleMin = 0 {product}
bool CMSIncrementalMode = false {product}
uintx CMSIncrementalOffset = 0 {product}
bool CMSIncrementalPacing = true {product}
uintx CMSIncrementalSafetyFactor = 10 {product}
uintx CMSIndexedFreeListReplenish = 4 {product}
intx CMSInitiatingOccupancyFraction = -1 {product}
uintx CMSIsTooFullPercentage = 98 {product}
double CMSLargeCoalSurplusPercent = 0.950000 {product}
double CMSLargeSplitSurplusPercent = 1.000000 {product}
bool CMSLoopWarn = false {product}
uintx CMSMaxAbortablePrecleanLoops = 0 {product}
intx CMSMaxAbortablePrecleanTime = 5000 {product}
uintx CMSOldPLABMax = 1024 {product}
uintx CMSOldPLABMin = 16 {product}
uintx CMSOldPLABNumRefills = 4 {product}
uintx CMSOldPLABReactivityFactor = 2 {product}
bool CMSOldPLABResizeQuicker = false {product}
uintx CMSOldPLABToleranceFactor = 4 {product}
bool CMSPLABRecordAlways = true {product}
uintx CMSParPromoteBlocksToClaim = 16 {product}
bool CMSParallelInitialMarkEnabled = true {product}
bool CMSParallelRemarkEnabled = true {product}
bool CMSParallelSurvivorRemarkEnabled = true {product}
uintx CMSPrecleanDenominator = 3 {product}
uintx CMSPrecleanIter = 3 {product}
uintx CMSPrecleanNumerator = 2 {product}
bool CMSPrecleanRefLists1 = true {product}
bool CMSPrecleanRefLists2 = false {product}
bool CMSPrecleanSurvivors1 = false {product}
bool CMSPrecleanSurvivors2 = true {product}
uintx CMSPrecleanThreshold = 1000 {product}
bool CMSPrecleaningEnabled = true {product}
bool CMSPrintChunksInDump = false {product}
bool CMSPrintEdenSurvivorChunks = false {product}
bool CMSPrintObjectsInDump = false {product}
uintx CMSRemarkVerifyVariant = 1 {product}
bool CMSReplenishIntermediate = true {product}
uintx CMSRescanMultiple = 32 {product}
uintx CMSSamplingGrain = 16384 {product}
bool CMSScavengeBeforeRemark = false {product}
uintx CMSScheduleRemarkEdenPenetration = 50 {product}
uintx CMSScheduleRemarkEdenSizeThreshold = 2097152 {product}
uintx CMSScheduleRemarkSamplingRatio = 5 {product}
double CMSSmallCoalSurplusPercent = 1.050000 {product}
double CMSSmallSplitSurplusPercent = 1.100000 {product}
bool CMSSplitIndexedFreeListBlocks = true {product}
intx CMSTriggerInterval = -1 {manageable}
uintx CMSTriggerRatio = 80 {product}
intx CMSWaitDuration = 2000 {manageable}
uintx CMSWorkQueueDrainThreshold = 10 {product}
bool CMSYield = true {product}
uintx CMSYieldSleepCount = 0 {product}
uintx CMSYoungGenPerWorker = 67108864 {pd product}
uintx CMS_FLSPadding = 1 {product}
uintx CMS_FLSWeight = 75 {product}
uintx CMS_SweepPadding = 1 {product}
uintx CMS_SweepTimerThresholdMillis = 10 {product}
uintx CMS_SweepWeight = 75 {product}
bool CheckEndorsedAndExtDirs = false {product}
bool CheckJNICalls = false {product}
bool ClassUnloading = true {product}
bool ClassUnloadingWithConcurrentMark = true {product}
intx ClearFPUAtPark = 0 {product}
bool ClipInlining = true {product}
uintx CodeCacheExpansionSize = 65536 {pd product}
uintx CodeCacheMinimumFreeSpace = 512000 {product}
bool CollectGen0First = false {product}
bool CompactFields = true {product}
intx CompilationPolicyChoice = 3 {product}
ccstrlist CompileCommand = {product}
ccstr CompileCommandFile = {product}
ccstrlist CompileOnly = {product}
intx CompileThreshold = 10000 {pd product}
bool CompilerThreadHintNoPreempt = true {product}
intx CompilerThreadPriority = -1 {product}
intx CompilerThreadStackSize = 0 {pd product}
uintx CompressedClassSpaceSize = 1073741824 {product}
uintx ConcGCThreads = 0 {product}
intx ConditionalMoveLimit = 3 {C2 pd product}
intx ContendedPaddingWidth = 128 {product}
bool ConvertSleepToYield = true {pd product}
bool ConvertYieldToSleep = false {product}
bool CrashOnOutOfMemoryError = false {product}
bool CreateMinidumpOnCrash = false {product}
bool CriticalJNINatives = true {product}
bool DTraceAllocProbes = false {product}
bool DTraceMethodProbes = false {product}
bool DTraceMonitorProbes = false {product}
bool Debugging = false {product}
uintx DefaultMaxRAMFraction = 4 {product}
intx DefaultThreadPriority = -1 {product}
intx DeferPollingPageLoopCount = -1 {product}
intx DeferThrSuspendLoopCount = 4000 {product}
bool DeoptimizeRandom = false {product}
bool DisableAttachMechanism = false {product}
bool DisableExplicitGC = false {product}
bool DisplayVMOutputToStderr = false {product}
bool DisplayVMOutputToStdout = false {product}
bool DoEscapeAnalysis = true {C2 product}
bool DontCompileHugeMethods = true {product}
bool DontYieldALot = false {pd product}
ccstr DumpLoadedClassList = {product}
bool DumpReplayDataOnError = true {product}
bool DumpSharedSpaces = false {product}
bool EagerXrunInit = false {product}
intx EliminateAllocationArraySizeLimit = 64 {C2 product}
bool EliminateAllocations = true {C2 product}
bool EliminateAutoBox = true {C2 product}
bool EliminateLocks = true {C2 product}
bool EliminateNestedLocks = true {C2 product}
intx EmitSync = 0 {product}
bool EnableContended = true {product}
bool EnableResourceManagementTLABCache = true {product}
bool EnableSharedLookupCache = true {product}
bool EnableTracing = false {product}
uintx ErgoHeapSizeLimit = 0 {product}
ccstr ErrorFile = {product}
ccstr ErrorReportServer = {product}
double EscapeAnalysisTimeout = 20.000000 {C2 product}
bool EstimateArgEscape = true {product}
bool ExitOnOutOfMemoryError = false {product}
bool ExplicitGCInvokesConcurrent = false {product}
bool ExplicitGCInvokesConcurrentAndUnloadsClasses = false {product}
bool ExtendedDTraceProbes = false {product}
ccstr ExtraSharedClassListFile = {product}
bool FLSAlwaysCoalesceLarge = false {product}
uintx FLSCoalescePolicy = 2 {product}
double FLSLargestBlockCoalesceProximity = 0.990000 {product}
bool FailOverToOldVerifier = true {product}
bool FastTLABRefill = true {product}
intx FenceInstruction = 0 {ARCH product}
intx FieldsAllocationStyle = 1 {product}
bool FilterSpuriousWakeups = true {product}
ccstr FlightRecorderOptions = {product}
bool ForceNUMA = false {product}
bool ForceTimeHighResolution = false {product}
intx FreqInlineSize = 325 {pd product}
double G1ConcMarkStepDurationMillis = 10.000000 {product}
uintx G1ConcRSHotCardLimit = 4 {product}
uintx G1ConcRSLogCacheSize = 10 {product}
intx G1ConcRefinementGreenZone = 0 {product}
intx G1ConcRefinementRedZone = 0 {product}
intx G1ConcRefinementServiceIntervalMillis = 300 {product}
uintx G1ConcRefinementThreads = 0 {product}
intx G1ConcRefinementThresholdStep = 0 {product}
intx G1ConcRefinementYellowZone = 0 {product}
uintx G1ConfidencePercent = 50 {product}
uintx G1HeapRegionSize = 0 {product}
uintx G1HeapWastePercent = 5 {product}
uintx G1MixedGCCountTarget = 8 {product}
intx G1RSetRegionEntries = 0 {product}
uintx G1RSetScanBlockSize = 64 {product}
intx G1RSetSparseRegionEntries = 0 {product}
intx G1RSetUpdatingPauseTimePercent = 10 {product}
intx G1RefProcDrainInterval = 10 {product}
uintx G1ReservePercent = 10 {product}
uintx G1SATBBufferEnqueueingThresholdPercent = 60 {product}
intx G1SATBBufferSize = 1024 {product}
intx G1UpdateBufferSize = 256 {product}
bool G1UseAdaptiveConcRefinement = true {product}
uintx GCDrainStackTargetSize = 64 {product}
uintx GCHeapFreeLimit = 2 {product}
uintx GCLockerEdenExpansionPercent = 5 {product}
bool GCLockerInvokesConcurrent = false {product}
uintx GCLogFileSize = 8192 {product}
uintx GCPauseIntervalMillis = 0 {product}
uintx GCTaskTimeStampEntries = 200 {product}
uintx GCTimeLimit = 98 {product}
uintx GCTimeRatio = 99 {product}
uintx HeapBaseMinAddress = 2147483648 {pd product}
bool HeapDumpAfterFullGC = false {manageable}
bool HeapDumpBeforeFullGC = false {manageable}
bool HeapDumpOnOutOfMemoryError = false {manageable}
ccstr HeapDumpPath = {manageable}
uintx HeapFirstMaximumCompactionCount = 3 {product}
uintx HeapMaximumCompactionInterval = 20 {product}
uintx HeapSizePerGCThread = 87241520 {product}
bool IgnoreEmptyClassPaths = false {product}
bool IgnoreUnrecognizedVMOptions = false {product}
uintx IncreaseFirstTierCompileThresholdAt = 50 {product}
bool IncrementalInline = true {C2 product}
uintx InitialBootClassLoaderMetaspaceSize = 4194304 {product}
uintx InitialCodeCacheSize = 2555904 {pd product}
uintx InitialHeapSize := 134217728 {product}
uintx InitialRAMFraction = 64 {product}
double InitialRAMPercentage = 1.562500 {product}
uintx InitialSurvivorRatio = 8 {product}
uintx InitialTenuringThreshold = 7 {product}
uintx InitiatingHeapOccupancyPercent = 45 {product}
bool Inline = true {product}
ccstr InlineDataFile = {product}
intx InlineSmallCode = 2000 {pd product}
bool InlineSynchronizedMethods = true {C1 product}
bool InsertMemBarAfterArraycopy = true {C2 product}
intx InteriorEntryAlignment = 16 {C2 pd product}
intx InterpreterProfilePercentage = 33 {product}
bool JNIDetachReleasesMonitors = true {product}
bool JavaMonitorsInStackTrace = true {product}
intx JavaPriority10_To_OSPriority = -1 {product}
intx JavaPriority1_To_OSPriority = -1 {product}
intx JavaPriority2_To_OSPriority = -1 {product}
intx JavaPriority3_To_OSPriority = -1 {product}
intx JavaPriority4_To_OSPriority = -1 {product}
intx JavaPriority5_To_OSPriority = -1 {product}
intx JavaPriority6_To_OSPriority = -1 {product}
intx JavaPriority7_To_OSPriority = -1 {product}
intx JavaPriority8_To_OSPriority = -1 {product}
intx JavaPriority9_To_OSPriority = -1 {product}
bool LIRFillDelaySlots = false {C1 pd product}
uintx LargePageHeapSizeThreshold = 134217728 {product}
uintx LargePageSizeInBytes = 0 {product}
bool LazyBootClassLoader = true {product}
intx LiveNodeCountInliningCutoff = 40000 {C2 product}
bool LogCommercialFeatures = false {product}
intx LoopMaxUnroll = 16 {C2 product}
intx LoopOptsCount = 43 {C2 product}
intx LoopUnrollLimit = 60 {C2 pd product}
intx LoopUnrollMin = 4 {C2 product}
bool LoopUnswitching = true {C2 product}
bool ManagementServer = false {product}
uintx MarkStackSize = 4194304 {product}
uintx MarkStackSizeMax = 536870912 {product}
uintx MarkSweepAlwaysCompactCount = 4 {product}
uintx MarkSweepDeadRatio = 1 {product}
intx MaxBCEAEstimateLevel = 5 {product}
intx MaxBCEAEstimateSize = 150 {product}
uintx MaxDirectMemorySize = 0 {product}
bool MaxFDLimit = true {product}
uintx MaxGCMinorPauseMillis = 4294967295 {product}
uintx MaxGCPauseMillis = 4294967295 {product}
uintx MaxHeapFreeRatio = 100 {manageable}
uintx MaxHeapSize := 2120220672 {product}
intx MaxInlineLevel = 9 {product}
intx MaxInlineSize = 35 {product}
intx MaxJNILocalCapacity = 65536 {product}
intx MaxJavaStackTraceDepth = 1024 {product}
intx MaxJumpTableSize = 65000 {C2 product}
intx MaxJumpTableSparseness = 5 {C2 product}
intx MaxLabelRootDepth = 1100 {C2 product}
intx MaxLoopPad = 11 {C2 product}
uintx MaxMetaspaceExpansion = 5451776 {product}
uintx MaxMetaspaceFreeRatio = 70 {product}
uintx MaxMetaspaceSize = 4294901760 {product}
uintx MaxNewSize := 706740224 {product}
intx MaxNodeLimit = 75000 {C2 product}
uint64_t MaxRAM = 0 {pd product}
uintx MaxRAMFraction = 4 {product}
double MaxRAMPercentage = 25.000000 {product}
intx MaxRecursiveInlineLevel = 1 {product}
uintx MaxTenuringThreshold = 15 {product}
intx MaxTrivialSize = 6 {product}
intx MaxVectorSize = 32 {C2 product}
uintx MetaspaceSize = 21807104 {pd product}
bool MethodFlushing = true {product}
uintx MinHeapDeltaBytes := 524288 {product}
uintx MinHeapFreeRatio = 0 {manageable}
intx MinInliningThreshold = 250 {product}
intx MinJumpTableSize = 10 {C2 pd product}
uintx MinMetaspaceExpansion = 339968 {product}
uintx MinMetaspaceFreeRatio = 40 {product}
uintx MinRAMFraction = 2 {product}
double MinRAMPercentage = 50.000000 {product}
uintx MinSurvivorRatio = 3 {product}
uintx MinTLABSize = 2048 {product}
intx MonitorBound = 0 {product}
bool MonitorInUseLists = false {product}
intx MultiArrayExpandLimit = 6 {C2 product}
bool MustCallLoadClassInternal = false {product}
uintx NUMAChunkResizeWeight = 20 {product}
uintx NUMAInterleaveGranularity = 2097152 {product}
uintx NUMAPageScanRate = 256 {product}
uintx NUMASpaceResizeRate = 1073741824 {product}
bool NUMAStats = false {product}
ccstr NativeMemoryTracking = off {product}
bool NeedsDeoptSuspend = false {pd product}
bool NeverActAsServerClassMachine = false {pd product}
bool NeverTenure = false {product}
uintx NewRatio = 2 {product}
uintx NewSize := 44564480 {product}
uintx NewSizeThreadIncrease = 5320 {pd product}
intx NmethodSweepActivity = 10 {product}
intx NmethodSweepCheckInterval = 5 {product}
intx NmethodSweepFraction = 16 {product}
intx NodeLimitFudgeFactor = 2000 {C2 product}
uintx NumberOfGCLogFiles = 0 {product}
intx NumberOfLoopInstrToAlign = 4 {C2 product}
intx ObjectAlignmentInBytes = 8 {lp64_product}
uintx OldPLABSize = 1024 {product}
uintx OldPLABWeight = 50 {product}
uintx OldSize := 89653248 {product}
bool OmitStackTraceInFastThrow = true {product}
ccstrlist OnError = {product}
ccstrlist OnOutOfMemoryError = {product}
intx OnStackReplacePercentage = 140 {pd product}
bool OptimizeFill = true {C2 product}
bool OptimizePtrCompare = true {C2 product}
bool OptimizeStringConcat = true {C2 product}
bool OptoBundling = false {C2 pd product}
intx OptoLoopAlignment = 16 {pd product}
bool OptoScheduling = false {C2 pd product}
uintx PLABWeight = 75 {product}
bool PSChunkLargeArrays = true {product}
intx ParGCArrayScanChunk = 50 {product}
uintx ParGCDesiredObjsFromOverflowList = 20 {product}
bool ParGCTrimOverflow = true {product}
bool ParGCUseLocalOverflow = false {product}
uintx ParallelGCBufferWastePct = 10 {product}
uintx ParallelGCThreads = 8 {product}
bool ParallelGCVerbose = false {product}
uintx ParallelOldDeadWoodLimiterMean = 50 {product}
uintx ParallelOldDeadWoodLimiterStdDev = 80 {product}
bool ParallelRefProcBalancingEnabled = true {product}
bool ParallelRefProcEnabled = false {product}
bool PartialPeelAtUnsignedTests = true {C2 product}
bool PartialPeelLoop = true {C2 product}
intx PartialPeelNewPhiDelta = 0 {C2 product}
uintx PausePadding = 1 {product}
intx PerBytecodeRecompilationCutoff = 200 {product}
intx PerBytecodeTrapLimit = 4 {product}
intx PerMethodRecompilationCutoff = 400 {product}
intx PerMethodTrapLimit = 100 {product}
bool PerfAllowAtExitRegistration = false {product}
bool PerfBypassFileSystemCheck = false {product}
intx PerfDataMemorySize = 32768 {product}
intx PerfDataSamplingInterval = 50 {product}
ccstr PerfDataSaveFile = {product}
bool PerfDataSaveToFile = false {product}
bool PerfDisableSharedMem = false {product}
intx PerfMaxStringConstLength = 1024 {product}
intx PreInflateSpin = 10 {pd product}
bool PreferInterpreterNativeStubs = false {pd product}
intx PrefetchCopyIntervalInBytes = 576 {product}
intx PrefetchFieldsAhead = 1 {product}
intx PrefetchScanIntervalInBytes = 576 {product}
bool PreserveAllAnnotations = false {product}
bool PreserveFramePointer = false {pd product}
uintx PretenureSizeThreshold = 0 {product}
bool PrintAdaptiveSizePolicy = false {product}
bool PrintCMSInitiationStatistics = false {product}
intx PrintCMSStatistics = 0 {product}
bool PrintClassHistogram = false {manageable}
bool PrintClassHistogramAfterFullGC = false {manageable}
bool PrintClassHistogramBeforeFullGC = false {manageable}
bool PrintCodeCache = false {product}
bool PrintCodeCacheOnCompilation = false {product}
bool PrintCommandLineFlags = false {product}
bool PrintCompilation = false {product}
bool PrintConcurrentLocks = false {manageable}
intx PrintFLSCensus = 0 {product}
intx PrintFLSStatistics = 0 {product}
bool PrintFlagsFinal := true {product}
bool PrintFlagsInitial = false {product}
bool PrintGC = false {manageable}
bool PrintGCApplicationConcurrentTime = false {product}
bool PrintGCApplicationStoppedTime = false {product}
bool PrintGCCause = true {product}
bool PrintGCDateStamps = false {manageable}
bool PrintGCDetails = false {manageable}
bool PrintGCID = false {manageable}
bool PrintGCTaskTimeStamps = false {product}
bool PrintGCTimeStamps = false {manageable}
bool PrintHeapAtGC = false {product rw}
bool PrintHeapAtGCExtended = false {product rw}
bool PrintHeapAtSIGBREAK = true {product}
bool PrintJNIGCStalls = false {product}
bool PrintJNIResolving = false {product}
bool PrintOldPLAB = false {product}
bool PrintOopAddress = false {product}
bool PrintPLAB = false {product}
bool PrintParallelOldGCPhaseTimes = false {product}
bool PrintPromotionFailure = false {product}
bool PrintReferenceGC = false {product}
bool PrintSafepointStatistics = false {product}
intx PrintSafepointStatisticsCount = 300 {product}
intx PrintSafepointStatisticsTimeout = -1 {product}
bool PrintSharedArchiveAndExit = false {product}
bool PrintSharedDictionary = false {product}
bool PrintSharedSpaces = false {product}
bool PrintStringDeduplicationStatistics = false {product}
bool PrintStringTableStatistics = false {product}
bool PrintTLAB = false {product}
bool PrintTenuringDistribution = false {product}
bool PrintTieredEvents = false {product}
bool PrintVMOptions = false {product}
bool PrintVMQWaitTime = false {product}
bool PrintWarnings = true {product}
uintx ProcessDistributionStride = 4 {product}
bool ProfileInterpreter = true {pd product}
bool ProfileIntervals = false {product}
intx ProfileIntervalsTicks = 100 {product}
intx ProfileMaturityPercentage = 20 {product}
bool ProfileVM = false {product}
bool ProfilerPrintByteCodeStatistics = false {product}
bool ProfilerRecordPC = false {product}
uintx PromotedPadding = 3 {product}
uintx QueuedAllocationWarningCount = 0 {product}
uintx RTMRetryCount = 5 {ARCH product}
bool RangeCheckElimination = true {product}
intx ReadPrefetchInstr = 0 {ARCH product}
bool ReassociateInvariants = true {C2 product}
bool ReduceBulkZeroing = true {C2 product}
bool ReduceFieldZeroing = true {C2 product}
bool ReduceInitialCardMarks = true {C2 product}
bool ReduceSignalUsage = false {product}
intx RefDiscoveryPolicy = 0 {product}
bool ReflectionWrapResolutionErrors = true {product}
bool RegisterFinalizersAtInit = true {product}
bool RelaxAccessControlCheck = false {product}
ccstr ReplayDataFile = {product}
bool RequireSharedSpaces = false {product}
uintx ReservedCodeCacheSize = 251658240 {pd product}
bool ResizeOldPLAB = true {product}
bool ResizePLAB = true {product}
bool ResizeTLAB = true {pd product}
bool RestoreMXCSROnJNICalls = false {product}
bool RestrictContended = true {product}
bool RewriteBytecodes = true {pd product}
bool RewriteFrequentPairs = true {pd product}
intx SafepointPollOffset = 256 {C1 pd product}
intx SafepointSpinBeforeYield = 2000 {product}
bool SafepointTimeout = false {product}
intx SafepointTimeoutDelay = 10000 {product}
bool ScavengeBeforeFullGC = true {product}
intx SelfDestructTimer = 0 {product}
uintx SharedBaseAddress = 0 {product}
ccstr SharedClassListFile = {product}
uintx SharedMiscCodeSize = 122880 {product}
uintx SharedMiscDataSize = 4194304 {product}
uintx SharedReadOnlySize = 16777216 {product}
uintx SharedReadWriteSize = 16777216 {product}
bool ShowMessageBoxOnError = false {product}
intx SoftRefLRUPolicyMSPerMB = 1000 {product}
bool SpecialEncodeISOArray = true {C2 product}
bool SplitIfBlocks = true {C2 product}
intx StackRedPages = 1 {pd product}
intx StackShadowPages = 6 {pd product}
bool StackTraceInThrowable = true {product}
intx StackYellowPages = 3 {pd product}
bool StartAttachListener = false {product}
intx StarvationMonitorInterval = 200 {product}
bool StressLdcRewrite = false {product}
uintx StringDeduplicationAgeThreshold = 3 {product}
uintx StringTableSize = 60013 {product}
bool SuppressFatalErrorMessage = false {product}
uintx SurvivorPadding = 3 {product}
uintx SurvivorRatio = 8 {product}
intx SuspendRetryCount = 50 {product}
intx SuspendRetryDelay = 5 {product}
intx SyncFlags = 0 {product}
ccstr SyncKnobs = {product}
intx SyncVerbose = 0 {product}
uintx TLABAllocationWeight = 35 {product}
uintx TLABRefillWasteFraction = 64 {product}
uintx TLABSize = 0 {product}
bool TLABStats = true {product}
uintx TLABWasteIncrement = 4 {product}
uintx TLABWasteTargetPercent = 1 {product}
uintx TargetPLABWastePct = 10 {product}
uintx TargetSurvivorRatio = 50 {product}
uintx TenuredGenerationSizeIncrement = 20 {product}
uintx TenuredGenerationSizeSupplement = 80 {product}
uintx TenuredGenerationSizeSupplementDecay = 2 {product}
intx ThreadPriorityPolicy = 0 {product}
bool ThreadPriorityVerbose = false {product}
uintx ThreadSafetyMargin = 52428800 {product}
intx ThreadStackSize = 0 {pd product}
uintx ThresholdTolerance = 10 {product}
intx Tier0BackedgeNotifyFreqLog = 10 {product}
intx Tier0InvokeNotifyFreqLog = 7 {product}
intx Tier0ProfilingStartPercentage = 200 {product}
intx Tier23InlineeNotifyFreqLog = 20 {product}
intx Tier2BackEdgeThreshold = 0 {product}
intx Tier2BackedgeNotifyFreqLog = 14 {product}
intx Tier2CompileThreshold = 0 {product}
intx Tier2InvokeNotifyFreqLog = 11 {product}
intx Tier3BackEdgeThreshold = 60000 {product}
intx Tier3BackedgeNotifyFreqLog = 13 {product}
intx Tier3CompileThreshold = 2000 {product}
intx Tier3DelayOff = 2 {product}
intx Tier3DelayOn = 5 {product}
intx Tier3InvocationThreshold = 200 {product}
intx Tier3InvokeNotifyFreqLog = 10 {product}
intx Tier3LoadFeedback = 5 {product}
intx Tier3MinInvocationThreshold = 100 {product}
intx Tier4BackEdgeThreshold = 40000 {product}
intx Tier4CompileThreshold = 15000 {product}
intx Tier4InvocationThreshold = 5000 {product}
intx Tier4LoadFeedback = 3 {product}
intx Tier4MinInvocationThreshold = 600 {product}
bool TieredCompilation = true {pd product}
intx TieredCompileTaskTimeout = 50 {product}
intx TieredRateUpdateMaxTime = 25 {product}
intx TieredRateUpdateMinTime = 1 {product}
intx TieredStopAtLevel = 4 {product}
bool TimeLinearScan = false {C1 product}
bool TraceBiasedLocking = false {product}
bool TraceClassLoading = false {product rw}
bool TraceClassLoadingPreorder = false {product}
bool TraceClassPaths = false {product}
bool TraceClassResolution = false {product}
bool TraceClassUnloading = false {product rw}
bool TraceDynamicGCThreads = false {product}
bool TraceGen0Time = false {product}
bool TraceGen1Time = false {product}
ccstr TraceJVMTI = {product}
bool TraceLoaderConstraints = false {product rw}
bool TraceMetadataHumongousAllocation = false {product}
bool TraceMonitorInflation = false {product}
bool TraceParallelOldGCTasks = false {product}
intx TraceRedefineClasses = 0 {product}
bool TraceSafepointCleanupTime = false {product}
bool TraceSharedLookupCache = false {product}
bool TraceSuspendWaitFailures = false {product}
intx TrackedInitializationLimit = 50 {C2 product}
bool TransmitErrorReport = false {product}
bool TrapBasedNullChecks = false {pd product}
bool TrapBasedRangeChecks = false {C2 pd product}
intx TypeProfileArgsLimit = 2 {product}
uintx TypeProfileLevel = 111 {pd product}
intx TypeProfileMajorReceiverPercent = 90 {C2 product}
intx TypeProfileParmsLimit = 2 {product}
intx TypeProfileWidth = 2 {product}
intx UnguardOnExecutionViolation = 0 {product}
bool UnlinkSymbolsALot = false {product}
bool Use486InstrsOnly = false {ARCH product}
bool UseAES = true {product}
bool UseAESIntrinsics = true {product}
intx UseAVX = 2 {ARCH product}
bool UseAdaptiveGCBoundary = false {product}
bool UseAdaptiveGenerationSizePolicyAtMajorCollection = true {product}
bool UseAdaptiveGenerationSizePolicyAtMinorCollection = true {product}
bool UseAdaptiveNUMAChunkSizing = true {product}
bool UseAdaptiveSizeDecayMajorGCCost = true {product}
bool UseAdaptiveSizePolicy = true {product}
bool UseAdaptiveSizePolicyFootprintGoal = true {product}
bool UseAdaptiveSizePolicyWithSystemGC = false {product}
bool UseAddressNop = true {ARCH product}
bool UseAltSigs = false {product}
bool UseAutoGCSelectPolicy = false {product}
bool UseBMI1Instructions = true {ARCH product}
bool UseBMI2Instructions = true {ARCH product}
bool UseBiasedLocking = true {product}
bool UseBimorphicInlining = true {C2 product}
bool UseBoundThreads = true {product}
bool UseCLMUL = true {ARCH product}
bool UseCMSBestFit = true {product}
bool UseCMSCollectionPassing = true {product}
bool UseCMSCompactAtFullCollection = true {product}
bool UseCMSInitiatingOccupancyOnly = false {product}
bool UseCRC32Intrinsics = true {product}
bool UseCodeCacheFlushing = true {product}
bool UseCompiler = true {product}
bool UseCompilerSafepoints = true {product}
bool UseCompressedClassPointers := true {lp64_product}
bool UseCompressedOops := true {lp64_product}
bool UseConcMarkSweepGC = false {product}
bool UseCondCardMark = false {C2 product}
bool UseCountLeadingZerosInstruction = true {ARCH product}
bool UseCountTrailingZerosInstruction = true {ARCH product}
bool UseCountedLoopSafepoints = false {C2 product}
bool UseCounterDecay = true {product}
bool UseDivMod = true {C2 product}
bool UseDynamicNumberOfGCThreads = false {product}
bool UseFPUForSpilling = true {C2 product}
bool UseFastAccessorMethods = false {product}
bool UseFastEmptyMethods = false {product}
bool UseFastJNIAccessors = true {product}
bool UseFastStosb = true {ARCH product}
bool UseG1GC = false {product}
bool UseGCLogFileRotation = false {product}
bool UseGCOverheadLimit = true {product}
bool UseGCTaskAffinity = false {product}
bool UseHeavyMonitors = false {product}
bool UseInlineCaches = true {product}
bool UseInterpreter = true {product}
bool UseJumpTables = true {C2 product}
bool UseLWPSynchronization = true {product}
bool UseLargePages = false {pd product}
bool UseLargePagesInMetaspace = false {product}
bool UseLargePagesIndividualAllocation := false {pd product}
bool UseLockedTracing = false {product}
bool UseLoopCounter = true {product}
bool UseLoopInvariantCodeMotion = true {C1 product}
bool UseLoopPredicate = true {C2 product}
bool UseMathExactIntrinsics = true {C2 product}
bool UseMaximumCompactionOnSystemGC = true {product}
bool UseMembar = false {pd product}
bool UseMontgomeryMultiplyIntrinsic = true {C2 product}
bool UseMontgomerySquareIntrinsic = true {C2 product}
bool UseMulAddIntrinsic = true {C2 product}
bool UseMultiplyToLenIntrinsic = true {C2 product}
bool UseNUMA = false {product}
bool UseNUMAInterleaving = false {product}
bool UseNewLongLShift = false {ARCH product}
bool UseOSErrorReporting = false {pd product}
bool UseOldInlining = true {C2 product}
bool UseOnStackReplacement = true {pd product}
bool UseOnlyInlinedBimorphic = true {C2 product}
bool UseOptoBiasInlining = true {C2 product}
bool UsePSAdaptiveSurvivorSizePolicy = true {product}
bool UseParNewGC = false {product}
bool frallelGC := true {product}
bool UseParallelOldGC = true {product}
bool UsePerfData = true {product}
bool UsePopCountInstruction = true {product}
bool UseRDPCForConstantTableBase = false {C2 product}
bool UseRTMDeopt = false {ARCH product}
bool UseRTMLocking = false {ARCH product}
bool UseSHA = false {product}
bool UseSHA1Intrinsics = false {product}
bool UseSHA256Intrinsics = false {product}
bool UseSHA512Intrinsics = false {product}
intx UseSSE = 4 {product}
bool UseSSE42Intrinsics = true {product}
bool UseSerialGC = false {product}
bool UseSharedSpaces = false {product}
bool UseSignalChaining = true {product}
bool UseSquareToLenIntrinsic = true {C2 product}
bool UseStoreImmI16 = false {ARCH product}
bool UseStringDeduplication = false {product}
bool UseSuperWord = true {C2 product}
bool UseTLAB = true {pd product}
bool UseThreadPriorities = true {pd product}
bool UseTypeProfile = true {product}
bool UseTypeSpeculation = true {C2 product}
bool UseUTCFileTimestamp = true {product}
bool UseUnalignedLoadStores = true {ARCH product}
bool UseVMInterruptibleIO = false {product}
bool UseXMMForArrayCopy = true {product}
bool UseXmmI2D = false {ARCH product}
bool UseXmmI2F = false {ARCH product}
bool UseXmmLoadAndClearUpper = true {ARCH product}
bool UseXmmRegToRegMoveAll = true {ARCH product}
bool VMThreadHintNoPreempt = false {product}
intx VMThreadPriority = -1 {product}
intx VMThreadStackSize = 0 {pd product}
intx ValueMapInitialSize = 11 {C1 product}
intx ValueMapMaxLoopSize = 8 {C1 product}
intx ValueSearchLimit = 1000 {C2 product}
bool VerifyMergedCPBytecodes = true {product}
bool VerifySharedSpaces = false {product}
intx WorkAroundNPTLTimedWaitHang = 1 {product}
uintx YoungGenerationSizeIncrement = 20 {product}
uintx YoungGenerationSizeSupplement = 80 {product}
uintx YoungGenerationSizeSupplementDecay = 8 {product}
uintx YoungPLABSize = 4096 {product}
bool ZeroTLAB = false {product}
intx hashCode = 5 {product}
2.2 java [-options] -jar jarfile [args...]
大家都知道一個java應用項目可以打包成一個jar,當然你必須指定一個擁有main函數的main class作為你這個jar包的程式入口。具體的方法是修改jar包内目錄META-INF下的MANIFEST.MF檔案。比如有個叫做test.jar的jar包,裡面有一個擁有main函數的類fu.zhi.zhe.MainClass。我們就隻要在MANIFEST.MF裡面添加如下一句話:fu.zhi.zhe.MainClass。然後我們可以在控制台裡輸入java -jar test.jar即可以運作這個jar。
當我們的項目需要引用其他第三方的jar包lib.jar,此時用java -jar執行這個test.jar的時候報找不到Class異常,原因就是jar引用不到放在自己内部的jar包。那怎麼辦?運作時将其加入classpath的方式行不行?就是在運作jar的同時加入classpath參數:
java -classpath lib.jar -jar test.jar
這種方式是不行的,因為使用classpath指定的jar是由AppClassloader來加載,java 指令 加了-jar 參數以後,AppClassloader就隻關注test.jar範圍内的class了,classpath參數失效。那該怎麼引用其他的jar包呢?
方法一、使用Bootstrap Classloader來加載這些類
java -Xbootclasspath/a: some.jar;some2.jar; -jar test.jar
方法二、使用Extension Classloader來加載
你可以把需要加載的jar都扔到<JAVA_HOME>\jre\lib\ext下面,這個目錄下的jar包會在Bootstrap Classloader工作完後由Extension Classloader來加載。
方法三、還是用AppClassloader來加載,不過不需要classpath參數了
我們在MANIFEST.MF中添加如下代碼:
Class-Path: lib/some.jar
lib是和test.jar同目錄的一個子目錄,test.jar要引用的some.jar包就在這裡面。
如果有多個jar包需要引用的情況:
Class-Path: lib/some.jar lib/some2.jar
每個單獨的jar用空格隔開就可以了。注意使用相對路徑。
注:如果META-INF 下包含INDEX.LIST檔案的話,可能會使Class-Path配置失效。INDEX.LIST是Jar打包工具打包時生成的索引檔案,删除對運作不産生影響。
方法四、自定義Classloader來加載
這種方法是終極解決方案,基本上那些知名java應用都是那麼幹的,如tomcat、jboss等等。
注意:以上四種方法都可以用,特别是程式運作在非常單純的環境中時。但是,如果是運作在多任務,多應用的環境中時,最好每個應用都能互相獨立,第一種和第二種方案都有可能對其他應用産生影響,是以最好就是選擇第三種和第四種。