JVM 作為一個通用的虛擬機(jī)褪秀,我們可以通過啟動 Java 命令時指定不同的 JVM 參數(shù),讓 JVM 調(diào)整自己的運(yùn)行狀態(tài)和行為薛训,內(nèi)存管理和垃圾回收的 GC 算法媒吗,添加和處理調(diào)試和診斷信息等等。本節(jié)概括地講講 JVM 參數(shù)乙埃,對于 GC 相關(guān)的詳細(xì)參數(shù)將在后續(xù)的 GC 章節(jié)說明和分析闸英。
直接通過命令行啟動 Java 程序的格式為:
java [options] classname [args]
java [options] -jar filename [args]
其中:
-
[options]
部分稱為 "JVM 選項(xiàng)",對應(yīng) IDE 中的 VM options, 可用jps -v
查看。 -
[args]
部分是指 "傳給main函數(shù)的參數(shù)", 對應(yīng) IDE 中的 Program arguments, 可用jps -m
查看介袜。
如果是使用 Tomcat 之類自帶 startup.sh 等啟動腳本的程序甫何,我們一般把相關(guān)參數(shù)都放到一個腳本定義的 JAVA_OPTS 環(huán)境變量中,最后腳本啟動 JVM 時會把 JAVA_OPTS 變量里的所有參數(shù)都加到命令的合適位置遇伞。
如果是在 IDEA 之類的 IDE 里運(yùn)行的話辙喂,則可以在“Run/Debug Configurations”里看到 VM 選項(xiàng)和程序參數(shù)兩個可以輸入?yún)?shù)的地方鸠珠,直接輸入即可巍耗。
上圖輸入了兩個 VM 參數(shù),都是環(huán)境變量跳芳,一個是指定文件編碼使用 UTF-8芍锦,一個是設(shè)置了環(huán)境變量 a 的值為 1。
Java 和 JDK 內(nèi)置的工具飞盆,指定參數(shù)時都是一個 -
娄琉,不管是長參數(shù)還是短參數(shù)次乓。有時候,JVM 啟動參數(shù)和 Java 程序啟動參數(shù)孽水,并沒必要嚴(yán)格區(qū)分票腰,大致知道都是一個概念即可。
JVM 的啟動參數(shù), 從形式上可以簡單分為:
- 以
-
開頭為標(biāo)準(zhǔn)參數(shù)女气,所有的 JVM 都要實(shí)現(xiàn)這些參數(shù)杏慰,并且向后兼容。 - 以
-X
開頭為非標(biāo)準(zhǔn)參數(shù)炼鞠, 基本都是傳給 JVM 的缘滥,默認(rèn) JVM 實(shí)現(xiàn)這些參數(shù)的功能,但是并不保證所有 JVM 實(shí)現(xiàn)都滿足谒主,且不保證向后兼容朝扼。 - 以
-XX:
開頭為非穩(wěn)定參數(shù), 專門用于控制 JVM 的行為,跟具體的 JVM 實(shí)現(xiàn)有關(guān)霎肯,隨時可能會在下個版本取消擎颖。 -
-XX:+-Flags
形式,+-
是對布爾值進(jìn)行開關(guān)。 -
-XX:key=value
形式, 指定某個選項(xiàng)的值观游。
實(shí)際上搂捧,直接在命令行輸入 java,然后回車懂缕,就會看到 java 命令可以其使用的參數(shù)列表說明: