轉自:https://www.jianshu.com/p/1c6b5c2e95f9
JVM參數分類
JVM參數分為標准參數和非標准參數:
- 標准參數:
"-"
開頭的參數,如-client
,-server
等 - 非標准參數:
"-X"
和"-XX"
開頭的參數,如-Xmx
,-XX:+DisableExplicitGC
或者簡單分為三類:
"-"
開頭的參數"-X"
開頭的參數"-XX"
開頭的參數
標准參數("-"
開頭的參數)
-client
選擇client模式的VM。客戶端常使用
-server ※
選擇server模式的VM。服務端常使用
-agentlib:libname[=options]
Loads native agent library libname, for example:
-agentlib:hprof
-agentlib:jdwp=help
-agentlib:hprof=help
See JVMTI Agent Command-Line Options at
http://docs.oracle.com/javase/7/docs/platform/jvmti/jvmti.html#starting
-agentpath:pathname[=options]
Loads a native agent library by full pathname.
-classpath classpath
指定查找class的路徑。
可以是文件夾(directories)、jar文件(jar files)或者zip文檔(zip archives)。
Linux平台用冒號分隔
如:
java -classpath lib/*:test.jar:test2.jar Main.class
-cp classpath
同-classpath
,是其簡寫模式
-Dproperty=value
設置系統參數。在代碼中可以通過System.getProperty(property)獲取
如:
java -Denv=test Main.class
程序中可以通過System.getProperty("env")獲得其值為"test"
-d32
在32位環境中運行程序。如果不支持32位環境,則報錯。
如果使用的不是64位系統,則-d32
是默認添加的
-d64
在64位環境中運行程序。如果不支持32位環境,則報錯。
注:存在-server
參數時,-d64
是默認添加的
-jar
執行可執行jar包。
第一個參數是jar包名字,而非Main Class名字。
要使這個參數生效,要有一個前提,即manifest文件中需要有下面一行:
Main-Class: classname
一個manifest文件示例:
Manifest-Version: 1.0
Implementation-Title: spring-boot-web-base
Implementation-Version: 1.0-SNAPSHOT
Built-By: michealyang
Implementation-Vendor-Id: com.michealyang
Spring-Boot-Version: 2.0.1.RELEASE
Main-Class: org.springframework.boot.loader.JarLauncher
Start-Class: com.michealyang.webbase.Application
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Created-By: Apache Maven 3.3.9
Build-Jdk: 1.8.0_162-ea
Implementation-URL: http://maven.apache.org
-javaagent:jarpath[=options]
Loads a Java programming language agent. For more information about instrumenting Java applications, see the java.lang.instrument package description in the Java API documentation at http://docs.oracle.com/javase/7/docs/api/java/lang/instrument/package-summary.html
-verbose
打印虛擬機運行信息
可以在程序啟動時,做為參數傳入。也可做為命令行使用
做為命令行使用的語法是:
java -verbose:[class|gc|jni] {pid}
verbose的冒號后面支持三個參數,即class, gc, jni
-verbose:class
打印加載的class信息
如:
java -verbose:class 12093
數據結果大致為:
[Opened /usr/local/jdk1.8.0_45/jre/lib/rt.jar] [Loaded java.lang.Object from /usr/local/jdk1.8.0_45/jre/lib/rt.jar] [Loaded java.io.Serializable from /usr/local/jdk1.8.0_45/jre/lib/rt.jar] [Loaded java.lang.Comparable from /usr/local/jdk1.8.0_45/jre/lib/rt.jar] [Loaded java.lang.CharSequence from /usr/local/jdk1.8.0_45/jre/lib/rt.jar] [Loaded java.lang.String from /usr/local/jdk1.8.0_45/jre/lib/rt.jar]
-verbose:gc
在啟動參數中加上-verbose:gc
當發生gc時,可以打印出gc相關的信息;該信息不夠高全面,等同於-XX:+PrintGC
。其實只要設置-XX:+PrintGCDetails
就會自動帶上-verbose:gc
和-XX:+PrintGC
-verbose:jni
打印native方法或者其他native interface的調用信息
-version
打印java版本
java -version
結果為:
java version "1.8.0_45"
Java(TM) SE Runtime Environment (build 1.8.0_45-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)
"-X"
開頭的參數
"-X"
開頭的參數是非標准參數,也就是只能被部分VM識別,而不能被全部VM識別的參數。
官網解釋:
Options that begin with -X are non-standard (not guaranteed to be supported on all VM implementations), and are subject to change without notice in subsequent releases of the JDK
關於"-X"
的常見參數,見下面的按功能分類
"-XX"
開頭的參數
"-XX"
開頭的參數是非穩定參數,隨時可能被修改或者移除。
官網解釋:
Options that are specified with -XX are not stable and are subject to change without notice.
-XX
參數的常見語法有:
- -XX:+[PARAM], 開啟該參數的功能,如
-XX:+DisableExplicitGC
,開啟禁止顯式GC - -XX:-[PARAM], 關閉該參數的功能,如
-XX:-DisableExplicitGC
,關閉禁止顯示GC - -XX:PARAM=VALUE, 設置參數的值,如
-XX:SurvivorRatio=80
,設置eden/survivor的比值
關於"-XX"
的常見參數,見下面的按功能分類
按功能分類
標記了※的表示常用參數
內存參數
-Xmx[value] ※
設置堆內存最大值
-Xmx1g
或者
-Xmx1024m
-Xms[value] ※
設置堆內存最小值。一般與-Xmx
設置一樣大
-Xmx1g
-Xmn[value] ※
設置新生代大小
-Xmn256m
-Xss[value] ※
設置棧空間大小
-Xss128k
-XX:SurvivorRatio=[value] ※
新生代Eden和Survivor划分比例
-XX:SurvivorRatio=8
-XX:PermSize=[value] ※
設置永久代初始大小。JDK8中已移除
-XX:PermSize=128m
-XX:MaxPermSize=[value] ※
設置永久代最大值。JDK8中已移除
-XX:MaxPermSize=128m
-XX:MetaspaceSize=[value] ※
設置meta區大小。JDK8增加
-XX:MetaspaceSize=128m
-XX:MaxMetaspaceSize=[value] ※
設置永久代最大值。JDK8中已移除
-XX:MaxMetaspaceSize=128m
-XX:ReservedCodeCacheSize
用於設置Code Cache大小,JIT編譯的代碼都放在Code Cache中,若Code Cache空間不足則JIT無法繼續編譯,並且會去優化,比如編譯執行改為解釋執行,由此,性能會降低
-XX:ReservedCodeCacheSize=128m
行為相關參數
Behavioral Options,即影響VM基本行為的參數
-XX:-DisableExplicitGC ※
GC參數
-XX:-UseSerialGC
使用串行垃圾回收器回收新生代
-XX:+UseParNewGC ※
使用並行垃圾回收器回收新生代
-XX:ParallerGCThreads
當使用-XX:+UseParNewGC
時,該參數設定GC的線程數,默認與CPU核數相同
-XX:-UseParallelGC
使用Parallel Scavenge垃圾回收器
-XX:UseParallelGC = “Parallel Scavenge” + “Serial Old”
-XX:-UseParallelOldGC
用並行垃圾回收器進行full gc
-XX:UseParallelOldGC = “Parallel Scavenge” + “Parallel Old”
-XX:-UseConcMarkSweepGC ※
使用CMS做為垃圾回收器
注:當前常見的垃圾回收器組合是下面這種:
-XX:+UseConcMarkSweepGC -XX:+UseParNewGC
-Xloggc:[path] ※
設置gc日志位置
-Xloggc:/opt/logs/mobile/admin.gc.log
-XX:+PrintGC ※
打印GC詳情
輸出形式:
[GC 118250K->113543K(130112K), 0.0094143 secs]
[Full GC 121376K->10414K(130112K), 0.0650971 secs]
-XX:+PrintGCDetails ※
打印GC更詳細的信息
輸出形式:
[GC [DefNew: 8614K->781K(9088K), 0.0123035 secs] 118250K->113543K(130112K), 0.0124633 secs]
[GC [DefNew: 8614K->8614K(9088K), 0.0000665 secs][Tenured: 112761K->10414K(121024K), 0.0433488 secs] 121376K->10414K(130112K), 0.0436268 secs]
G1參數
Garbage First Garbage Collection Options
-XX:+UseG1GC
使用G1做為垃圾回收器
-XX:MaxGCPauseMillis=n
Sets a target for the maximum GC pause time. This is a soft goal, and the JVM will make its best effort to achieve it.
-XX:InitiatingHeapOccupancyPercent=n
Percentage of the (entire) heap occupancy to start a concurrent GC cycle. It is used by GCs that trigger a concurrent GC cycle based on the occupancy of the entire heap, not just one of the generations (e.g., G1). A value of 0 denotes 'do constant GC cycles'. The default value is 45.
-XX:NewRatio=n
old區/new區的比例,默認為2
-XX:SurvivorRatio=n
eden/survivor的比值,默認為8.
-XX:MaxTenuringThreshold=n
Maximum value for tenuring threshold. The default value is 15.
-XX:ParallelGCThreads=n
Sets the number of threads used during parallel phases of the garbage collectors. The default value varies with the platform on which the JVM is running.
-XX:ConcGCThreads=n
Number of threads concurrent garbage collectors will use. The default value varies with the platform on which the JVM is running.
-XX:G1ReservePercent=n
Sets the amount of heap that is reserved as a false ceiling to reduce the possibility of promotion failure. The default value is 10.
-XX:G1HeapRegionSize=n
With G1 the Java heap is subdivided into uniformly sized regions. This sets the size of the individual sub-divisions. The default value of this parameter is determined ergonomically based upon heap size. The minimum value is 1Mb and the maximum value is 32Mb.
CMS參數
-XX:-UseConcMarkSweepGC ※
使用CMS做為垃圾回收器
性能相關參數
Performance Options
-XX:+AggressiveOpts
Turn on point performance compiler optimizations that are expected to be default in upcoming releases. (Introduced in 5.0 update 6.)
-XX:+UseLargePages
Use large page memory. (Introduced in 5.0 update 5.) For details, see Java Support for Large Memory Pages.
-XX:+OptimizeStringConcat
Optimize String concatenation operations where possible. (Introduced in Java 6 Update 20)
debug相關參數
Debugging Options
-XX:+PrintFlagsInitial
顯示JVM所有可設置的參數及它們的值
-XX:+PrintFlagsFinal
顯示所有可設置的參數及它們的值
可以設置的參數默認是不包括diagnostic或experimental系的。要在-XX:+PrintFlagsFinal
的輸出里看到這兩種參數的信息,分別需要顯式指定-XX:+UnlockDiagnosticVMOptions
和-XX:+UnlockExperimentalVMOptions
。
語法:
java -PrintFlagsFinal -version {id}
添加
-version
是防止被理解成啟動java程序
輸出示例:

-XX:ErrorFile=[path] ※
生成error 文件的路徑
-XX:ErrorFile=/opt/logs/mobile/admin.error
-XX:+ShowMessageBoxOnError
當jvm crash的時候在linux里會啟動gdb 去分析和調式,適合在測試環境中使用
-XX:+HeapDumpOnOutOfMemoryError ※
OOM的時候dump出內存。
-XX:HeapDumpPath
dump文件位置
Q & A
Q: -Xss和-XX:ThreadStackSize有啥區別?
A: 本質上是沒有區別的。-Xss
是在HotSpot出現之前就存在的,而-XX:ThreadStackSize
是HotSpot的內置參數。也就是說-Xss
適用於很多VM,包括HotSpot,而-XX:ThreadStackSize
只適用於HotSpot。
另外,使用jinfo的時候,應該使用ThreadStackSize
:
jinfo -float ThreadStackSize [pid]
作者:齊晉
鏈接:https://www.jianshu.com/p/1c6b5c2e95f9
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權並注明出處。