摘要
已經(jīng)使用了一段時間的JAVA,期間也了解和用過一些JVM(Java Virtual machine)參數(shù),但是沒有仔細去整理過每個參數(shù)代表的意義,為此整理成文。
Java使用方式
java [options] classname [args]
java [options] -jar filename [args]
options: 命令行選項,空格分隔
classname: 啟動的class名稱
filename: Jar包名稱(JAR)
args: main()方法參數(shù),空格隔開
加載的class的main()方法必須定義為public static,并且無返回值,參數(shù)是字符串列表
public static void main(String[] args)
如果使用-jar選項,則args是JAR包包含的class。啟動class必須通過Main-Class的manifest指定,示例如下:
jar {
manifest {
attributes 'Main-Class': 'com.xx.xx'
}
}
Options
Java 命令行提供了以下幾種類型的選項
標準選項
非標準選項
高級運行選項
高級JIT編譯選項
高級垃圾回收選項
高級可用性選項
(1) 標準選項被所有類型的JVM支持。標準選項用來做常規(guī)操作,如查看版本,設(shè)定class path等。
(2) 非標準選項一般是指Java HotSpot Virtual Machine特定的選項,不能保證被所有類型的JVM支持,該類選項使用時,以-X開頭。
(3) 高級選項是用于Java HotSpot Virtual Machine特定區(qū)域調(diào)優(yōu)的選項,同樣不能保證被所有的JVM支持。該類選擇使用時,以-XX開頭。對于Boolean類型的選項,通過使用+表示選項生效,- 來標示選項無效。如-XX:+OptionName表示選項OptionName生效,-XX:-OptionName表示選項OptionName無效。
標準選項
所有類型的JVM均支持標準選項, 為此簡單列舉經(jīng)常用到的幾個選項。
-d32
將應用運行在32bit的環(huán)境,如果32bit環(huán)境未初始化或不支持,則報錯。默認是運行在32bit環(huán)境。
-d64
將應用運行在64bit環(huán)境。如果64bit環(huán)境未初始化或不支持,則報錯。默認是運行在32bit環(huán)境。
-help/-?
顯示幫助文檔
-verbose:class
顯示每個加載的class
-verbose:gc
顯示每次垃圾回收事件
-version
顯示當前java 版本
-disableassertions[:[packagename]…|:classname] / -da[:[packagename]…|:classname]
禁用斷言(assert),可以指定禁用斷言的package和class。
-disablesystemassertions / -dsa
禁用全部斷言(assert)
-enableassertions[:[packagename]…|:classname] / -ea[:[packagename]…|:classname]
啟用斷言,可以指定package和class。默認斷言是禁用的。
-enablesystemassertions / -esa
啟用全部斷言(assert)
-server
選擇Java HotSpot Server VM。64bit版本隱含設(shè)置-server。
-D[property]=value
定義系統(tǒng)屬性值。property變量是一個字符串代表屬性名,value代表設(shè)定的屬性值。
以設(shè)置系統(tǒng)的文件編碼為utf-8為例:
-Dfile.encoding=utf-8
?
非標準選項
非標準選項一般是指Java HotSpot Virtual Machine特定的選項。列舉經(jīng)常用到的幾個選項。
-X
顯示有效的-X選項的幫助信息
-Xbatch
禁用后臺編譯。默認情況下JVM是后臺編譯。該選項等同于 -XX:-BackgroundCompilation
-Xloggc:filename
將GC(garbage collection)信息重定向到filename。當-Xloggc和-verbose:gc同時給出時,-Xloggc將重載-verbose:gc
-Xmnsize
設(shè)置堆中年輕代(young generation)的初始值和最大值大小。單位是bytes,常用K,M,G (不區(qū)分大小寫)
年輕代主要放置新對象,這塊區(qū)域也是GC執(zhí)行比較頻繁的區(qū)域。如果該區(qū)域設(shè)置較小,可能導致頻繁minor GC,如果設(shè)置過大,只有Full GC執(zhí)行則每次GC耗時較長。Oracle建議的大小是整個堆大小的1/4 - 1/2之間。
以設(shè)置大小為256 MB為例:
? -Xmn256m
不同于-Xmn同時設(shè)置初始值和最大值,可通過-XX:NewSize設(shè)置初始,-XX:MaxNewSize設(shè)置最大值。
-Xmssize
設(shè)置堆的初始值,該值必須是1024的倍數(shù)并且大于1MB。
以設(shè)置初始值6 MB的堆為例:
? -Xms6m
如果該值不設(shè)置,則通過計算年輕代和老年代的和作為堆的初始值
-Xmxsize
指定應用的最大內(nèi)存大小,該值必須是1024的倍數(shù)并且大于2MB。對于服務(wù)型應用,-Xms和-Xmx常設(shè)置為相同,至于原因涉及垃圾回收機制,如果兩者設(shè)置相同則應用占據(jù)的內(nèi)存不進行動態(tài)擴展。
以設(shè)置最大內(nèi)存大小1G為例:
? -Xmx1g
-Xmx等價于高級選項-XX:MaxHeapSize
-Xsssize
設(shè)置線程棧的大小。
以設(shè)置大小為1024KB的線程棧為例:
? -Xss1024k
-Xss等價于高級選項-XX:ThreadStackSize
高級運行選項
該類選項控制Java HotSpot VM運行時的情況。列舉經(jīng)常用到的幾個選項。
-XX:+DisableAttachMechanism
啟用該選項會導致附件在JVM的工具類如jcmd, jstack,jmap jinfo無效。默認情況該選項無效,JVM提供的工具類可使用。
-XX:MaxDirectMemorySize=size
設(shè)置最大直接內(nèi)存大小為size,對于新IO可以使用堆外內(nèi)存(直接內(nèi)存)構(gòu)建對象,該選項是設(shè)置這塊區(qū)域的大小。
以設(shè)置最大直接內(nèi)存1MB為例:
? -XX:MaxDirectMemorySize=1m
-XX:ThreadStackSize
設(shè)置線程棧大小,等價于-Xss選項。
高級可用性選項
該類選項提供收集系統(tǒng)信息和debug的能力。列舉經(jīng)常用到的幾個選項。
-XX:+HeapDumpOnOutOfMemory
啟用該選項,當出現(xiàn)java.lang.OutOfMemoryError異常時,Java的堆信息會dump到當前目錄的文件中,文件命名為: java_pid[進程PID].hprof,可以通過-XX:HeapDumpPath指定dump文件路徑。通過dump的文件我們利用工具,如MemoryAnalyzer,可以查看系統(tǒng)當時的情況,默認禁用。
-XX:HeapDumpPath=path
指定OutOfMemoryError異常時dump文件的路徑,示例如下:
# 指定dump文件路徑
-XX:HeapDumpPath=/var/log/java_heapdump.hprof
-XX:LogFile=path
設(shè)置log文件,默認情況下在當前目前,命名為hotspot.log。一般我們會利用slf4j工具設(shè)置日志,該選項倒不怎么使用。
高級垃圾回收選項
該類選項是Java HotSpot VM 用來控制垃圾回收。
-XX:+AggressiveHeap
啟用Java堆優(yōu)化。基于服務(wù)器的情況自適應的進行堆優(yōu)化。默認禁用。
-XX:+CMSClassUnloadingEnabled
啟用類卸載當使用CMS(the concurrent mark-sweep)垃圾收集器時。默認啟用。如果禁用該選擇,設(shè)置為-XX:-CMSClassUnloadingEnabled
-XX:CMSInitiatingOccupancyFraction=precent
設(shè)置老年代占比當開始CMS垃圾收集時,數(shù)值在0-100之間。默認值-1。
以老年代占比70%為例:
-XX:CMSInitiatingOccupancyFraction=70
1
-XX:ConcGCThreads=threads
設(shè)置垃圾回收線程的個數(shù)在并發(fā)GC時。默認值為JVM中有效的CPU的個數(shù)。
以線程個數(shù)2為例:
-XX:ConcGCThreads=2
1
-XX:ParallelGCThreads=threads
設(shè)置垃圾回收線程的個數(shù)在并行GC時。默認值為JVM中有效的CPU的個數(shù)。
以線程個數(shù)2為例:
-XX:ParallelGCThreads=2
1
-XX:+DisableExplicitGC
啟用該選項,程序中調(diào)用System.gc()的處理均無效。默認禁用該選項,即程序中顯示調(diào)用System.gc()是執(zhí)行的。
-XX:InitialHeapSize=size
設(shè)置應用內(nèi)存初始大小,該值為0或為1024的倍數(shù)并且大于1 MB
以設(shè)置初始內(nèi)存大小為6 MB為例:
-XX:InitialHeapSize=6m
-XX:InitialHeapSize=6144k
-XX:InitialHeapSize=62914561
如果設(shè)置為0,則初始值為老年代和新生代的和。
-XX:MaxHeapSize=size
設(shè)置應用內(nèi)存最大值,該值為1024的倍數(shù)并且大于2 MB,該值通常與-XX:InitialHeapSize設(shè)置相同。
該選項等價于-Xmx
-XX:NewRatio=ratio
設(shè)置年輕代和老年代的比值,默認為2。
以比值為1為例:
-XX:NewRatio=1
-XX:NewSize=size
設(shè)置堆的年輕代的初始值大小,等價于選項 -Xmn
-XX:+PrintGCDetails
打印每一次GC的詳細信息,默認禁用。
-XX:+PrintGCDateStamps
每次GC均顯示時間戳,默認禁用
-XX:+PrintGCApplicationStoppedTime
打印GC延遲時長,默認禁用
-XX:+UseConCMarkSweepGC
啟用該選項表示在老年代的垃圾回收采用CMS垃圾回收器。啟用該選項之后,-XX:+UseParNewGC選項會自動啟用,并且不能禁用。默認禁用。在JDK 8中,老年代使用CMS的組合方式,年輕代不使用ParNew,即-XX:-UseParNewGC和-XX:+UseConCMarkSweepGC被廢棄。
-XX:+UseG1GC
啟用G1(garbage-first)垃圾收集器。G1是一種服務(wù)器風格的垃圾收集器,針對具有大量RAM的多處理器機器。目標是減少GC延時并且保持吞吐量。建議在設(shè)置堆(>= 6 GB)較大時使用。默認禁用。
-XX:+UseParallelGC
啟用Parallel Scavenge垃圾收集器,該垃圾收集器是多進程處理,目標是提高吞吐量。該選項啟用后,-XX:+UseParallelOldGC會自動啟用,除非顯示禁用。默認禁用。
-XX:+UseParallelOldGC
啟用該選項,在Full GC時使用Parallel Garbage 垃圾收集器。默認禁用。與-XX:+UseParallelGC配對使用。
-XX:+UseParNewGC
啟用該選項,在年輕代采用并行線程垃圾回收器。默認禁用。在JDK 8中,年輕代使用ParNew,老年代不使用CMS的組合方式,即-XX:+UseParNewGC和-XX:-UseConCMarkSweepGC被廢棄。
-XX:+UseSerialGC
啟用單線程垃圾回收器。針對簡單的小應用,不需要特別垃圾回收設(shè)置,該選項是一個交好的選擇。默認禁用。
最后配張年輕代和老年代垃圾回收器的組合圖,加深理解。
參考文獻
[1] jdk 1.8 幫助文檔
[2] 深入理解Java虛擬機: JVM高級特性和最佳實踐