JVM 參數 1. 標準參數:不會隨著jdk版本的變化而變化。比如:java version、java help 2. 非標準參數:隨著JDK版本的變化而變化。 X參數【用的較少】非標準參數,也就是在JDK各個版本中可能會變動 XX參數【用的最多:JVM調優額Debug】非標準化參數,相對不穩定。 ...
JVM 參數
-
標準參數:不會隨著jdk版本的變化而變化。比如:java -version、java -help
-
非標準參數:隨著JDK版本的變化而變化。
-X參數【用的較少】非標準參數,也就是在JDK各個版本中可能會變動
# 修改執行方式 # compiled 編譯執行方式,第一次使用就編譯成本地代碼 java -Xcomp -version # interpreted 解釋執行方式 java -Xini -version # mixed 預設的混合執行方式,混合模式,JVM自己來決定 java -Xmixed -version
-XX參數【用的最多:JVM調優額Debug】非標準化參數,相對不穩定。
boolean類型
格式:-XX:[+-]<name> +或-表示啟用或者禁用name屬性 比如: -XX:+UseConcMarkSweepGC 表示啟用CMS類型的垃圾回收器 -XX:+UseG1GC 表示啟用G1類型的垃圾回收器 # 設置JVM使用垃圾收集器 +:使用,-:未使用 -XX:+/-UseG1GC
非boolean類型
格式:-XX<name>=<value>表示name屬性的值是value 比如: -XX:MaxGCPauseMillis=500 # 設置初始堆記憶體 -XX:initialHeapSize=100M # 簡寫方式 ===>>> -Xms100M # 設置最大堆記憶體 -XX:MaxHeapSize=100M # 簡寫方式 ===>>> -Xmx100M
列印出JAVA進程中所有JVM的參數:
- 執行命令
java -XX:+PrintFlagsFinal -version
即可列印出JVM中各參數。由於參數較多,建議將參數放入文件中查看:java -XX:+PrintFlagsFinal -version > xxx.txt
- 使用
jinfo -flag ${參數名} ${PID}
也可查看對應JVM參數值
-XX:+PrintFlagsFinal
如何設置JVM參數:
以下方式是JAVA進程還未啟動
- 在開發工具中,比如IDEA中的啟動配置項中 VM options
- SpringBoot jar包 啟動的命令 java -jar -Xms100M test.jar
- 在java語言的中間件中如Tomcat中的 bin 目錄下的 catalina.sh/bat 中的JAVA_OPTIONS=""
以下方式是當JAVA進程已經啟動後該如何設置
- 實時修改某個JVM參數的值 jinfo修改(參數只有被標記為manageable的flags可以被實時修改)
常用參數:
參數 | 含義 | 說明 |
---|---|---|
XX:CICompilerCount=3 | 最大並行編譯數 | 如果設置大於1,雖然編譯速度會提高,但是同樣影響系統穩定性,會增加JVM崩潰的可能 |
-XX:InitialHeapSize=100M | 初始化堆大小 | 簡寫-Xms100M |
-XX:MaxHeapSize=100M | 最大堆大小 | 簡寫-Xm x 100M |
-XX:NewSize=20M | 設置年輕代的大小 | |
-XX:MaxNewSize=50M | 年輕代最大大小 | |
-XX:OldSize=50M | 設置老年代大小 | |
-XX:MetaspaceSize=50M | 設置方法區大小 | |
-XX:MaxMetaspaceSize=50M | 方法區最大大小 | |
-XX:+UseParallelGC | 使用UseParallelGC | 新生代,吞吐量優先 |
-XX:+UseParallelOldGC | 使用UseParallelOldGC | 老年代,吞吐量優先 |
-XX:+UseConcMarkSweepGC | 使用CMS | 老年代,停頓時間優先 |
-XX:+UseG1GC | 使用G1GC | 新生代,老年代,停頓時間優先 |
-XX:NewRatio | 新老生代的比值 | 比如-XX:Ratio=4,則表示新生代:老年代=1:4,也就是新生代占整個堆記憶體的1/5 |
-XX:SurvivorRatio | 兩個S區和Eden區的比值 | 比如-XX:SurvivorRatio=8,也就是(S0+S1):Eden=2:8,也就是一個S占整個新生代的1/10 |
-XX:+HeapDumpOnOutOfMemoryError | 啟動堆記憶體溢出列印 | 當JVM堆記憶體發生溢出時,也就是OOM,自動生成dump文件 |
-XX:HeapDumpPath=heap.hprof | 指定堆記憶體溢出列印目錄 | 表示在當前目錄生成一個heap.hprof文件 |
XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStampsXloggc:$CATALINA_HOME/logs/gc.log | 列印出GC日誌 | 可以使用不同的垃圾收集器,對比查看GC情況 |
-Xss128k | 設置每個線程的堆棧大小 | 經驗值是3000-5000最佳 |
-XX:MaxTenuringThreshold=6 | 提升年老代的最大臨界值 | 預設值為 15 |
-XX:InitiatingHeapOccupancyPercent | 啟動併發GC周期時堆記憶體使用占比 | G1之類的垃圾收集器用它來觸發併發GC周期,基於整個堆的使用率,而不只是某一代記憶體的使用比. 值為 0 則表示”一直執行GC迴圈”. 預設值為 45. |
-XX:G1HeapWastePercent | 允許的浪費堆空間的占比 | 預設是10%,如果併發標記可回收的空間小於10%,則不會觸發MixedGC。 |
-XX:MaxGCPauseMillis=200ms | G1最大停頓時間 | 暫停時間不能太小,太小的話就會導致出現G1跟不上垃圾產生的速度。最終退化成Full GC。所以對這個參數的調優是一個持續的過程,逐步調整到最佳狀態 |
-XX:ConcGCThreads=n | 併發垃圾收集器使用的線程數量 | 預設值隨JVM運行的平臺不同而不同 |
-XX:G1MixedGCLiveThresholdPercent=65 | 混合垃圾回收周期中要包括的舊區域設置占用率閾值 | 預設占用率為 65% |
-XX:G1MixedGCCountTarget=8 | 設置標記周期完成後,對存活數據上限為G1MixedGCLIveThresholdPercent 的舊區域執行混合垃圾回收的目標次數 | 預設8次混合垃圾回收,混合回收的目標是要控制在此目標次數以內 |
XX:G1OldCSetRegionThresholdPercent=1 | 描述Mixed GC時,Old Region被加入到CSet中 | 預設情況下,G1只把10%的Old Region加入到CSet中 |