JVM 參數及各部分含義(轉)


轉自: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程序

輸出示例:


 
image.png

-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
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權並注明出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM