JVM常用启动参数大全(附带解释)
目錄
一、官網
二、堆相關
三、方法區相關
四、執行引擎相關
五、垃圾回收相關
六、內存分配與垃圾回收的參數列表
一、官網
官網說明:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html
查看jvm啟動參數:jinfo -flag NewRatio pid
二、堆相關
-XX:+PrintFlagsInitial:查看所有的參數的默認初始值
-XX:+PrintFlagsFinal:查看所有的參數的最終值(可能會存在修改,不再是初始值)
-Xms200m,(b、k、m、g,大小寫皆可)用于表示堆區的起始內存,等價于-XX:InitialHeapSize(默認為物理內存的1/64)
-Xmx200m,(b、k、m、g,大小寫皆可)則用于表示堆區的最大內存,等價于-XX:MaxHeapSize(默認為物理內存的1/4)
-XX:+PrintGCDetails,控制臺打印堆、GC信息
-XX:+PringGC 、-verbose:gc ,打印gc簡要信息
-XX:NewRatio=2,表示新生代占1,老年代占2,新生代占整個堆的1/3
-XX:SurvivorRatio=8,表示Eden空間和另外兩個Survivor空間缺省所占的比例是8:1:1
-XX:-UseAdaptiveSizePolicy,表示關掉自適應內存分配策略(否則會自動分配內存空間,使-XX:SurvivorRatio=8并不完全生效)
-Xmn,設置新生代最大內存大小,跟“-XX:SurvivorRatio”沖突
-XX:MaxTenuringThreshold=<N>,進行設置對象在Survivor經歷幾次GC進入老年代
-XX:HandlePromotionFailure=<boolean>,空間分配擔保(大量對象在MinorGC之后仍然還有很多,那么這些對象可以直接放到老年代)
HandlePromotionFailure注意:
1.在發生Minor GC之前,虛擬機會檢查老年代最大可用的連續空間是否大于新生代所有對象的總空間。
? ? 如果大于,則此次Minor GC是安全的。
? ? 如果小于,則虛擬機會查看-XX:HandlePromotionFailure設置值是否允許擔保失敗。
? ? ? ? 如果HandlePromotionFailure=true,那么會繼續檢查老年代最大可用連續空間是否大于歷次晉升到老年代的對象的平均大小。
? ? ? ? ? ? 如果大于,則嘗試進行一次Minor GC,但這次Minor GC依然是由風險的;
? ? ? ? ? ? 如果小于,則改為進行一次Full GC。
? ? ? ? 如果HandlePromotionFailure=false,則改為進行一次Full GC。
2.在JDK6 Update24之后,HandlePromotionFailure參數不會再影響到虛擬機的空間分配擔保策略,觀察OpenJDK中的源碼變化,雖然源碼中還定義了HandlePromotionFailure參數,但是在代碼中已經不會再使用它。JDK6 Update24之后的規則變為只要老年代的連續空間大于新生代對象總大小或者歷次晉升的平均大小就會進行Minor GC,否則將進行Full GC。(相當于HandlePromotionFailure就是true)
? ? ? ??
-XX:UseTLAB,設置是否開啟TLAB空間
-XX:TLABWasteTargetPercent,設置TLAB空間所占用Eden空間的百分比大小
-XX:+DoEscapeAnalysis,顯式開啟逃逸分析(JDK 6u23之后默認開啟)。
-XX:+PrintEscapeAnalysis,查看逃逸分析的篩選結果。
-XX:+EliminateAllocations,開啟了標量替換(默認打開),允許將對象打散分配在棧上。
三、方法區相關
-XX:PermSize來設置永久代初始分配空間。默認值是20.75M(jdk7及以前才能用)
-XX:MaxPermSize來設定永久代最大可分配空間。32位機器默認是64M,64位機器默認是82M(jdk7及以前才能用)
-XX:MetaspaceSize和-XX:MaxMetaspaceSize(jdk8及以后替換為這倆,windows下,-XX:MetaspaceSize是21M,-XX:MaxMetaspaceSize的值是-1,即沒有限制)
MaxDirectMemorySize?設置直接內存,默認與堆的最大值-Xmx參數一致。
四、執行引擎相關
-XX:CompileThreshold設置方法調用計數器閾值,默認閾值在Client模式下是1500次,在Server模式下是10000次。超過這個閾值,就會觸發JIT編譯。?
-XX:-UseCounterDecay來關閉熱度衰減,讓方法計數器統計方法調用的絕對次數。
-XX:CounterHalfLifeTime參數設置半衰周期的時間,單位是秒
? ? -Xint:完全采用解釋器模式執行程序;
? ? -Xcomp:完全采用即時編譯器模式執行程序。如果即時編譯出現問題,解釋器會介入執行。
? ? -Xmixed:采用解釋器+即時編譯器的混合模式共同執行程序。
-XX:+UnlockExperimentalVMOptions -XX:+UseJVMCICompiler去激活,才可以使用jdk10加入的Graal編譯器。
-XX:StringTableSize可以設置StringTable的長度。
-XX:+PrintStringTableStatistics,打印字符串常量池信息
? ? UseStringDeduplication(bool):開啟String去重,默認是不開啟的,需要手動開啟。
?? ?PrintStringDeduplicationStatistics(bool):打印詳細的去重統計信息。
? ? StringDeduplicationAgeThreshold(uintx):達到這個年齡的String對象被認為是去重的候選對象。
-XX:+HeapDumpOnOutOfMemoryError:報oom時生成堆dump文件
五、垃圾回收相關
-XX:+PrintCommandLineFlags:查看命令行相關參數(包含使用的垃圾收集器)
-XX:+UseSerialGC參數可以指定年輕代和老年代都使用串行收集器
“-XX:+UseParNewGC”手動指定使用ParNew收集器執行內存回收任務。它表示年輕代使用并行收集器,不影響老年代。
-XX:ParallelGCThreads限制線程數量,默認開啟和CPU數據相同的線程數。
· -XX:+UseParallelGC?手動指定年輕代使用Parallel并行收集器執行內存回收任務。
· -XX:+UseParallelOldGC?手動指定老年代都是使用并行回收收集器。
?? ?分別適用于新生代和老年代。默認jdk8是開啟的。
?? ?上面兩個參數,默認開啟一個,另一個也會被開啟。(互相激活)
· -XX:ParallelGCThreads?設置年輕代并行收集器的線程數。一般地,最好與CPU數量相等,以避免過多的線程影響垃圾收集性能。
?? ?在默認情況下,當CPU數量小于8個,ParallelGCThreads的值等于CPU數量。
?? ?當CPU數量大于8個,ParallelGCThreads的值等于3 + [5 * CPU_Count / 8]。
· -XX:MaxGCPauseMillis?設置垃圾收集器最大停頓時間(即STW的時間)。單位是毫秒。
?? ?為了盡可能地把停頓時間控制在MaxGCPauseMills以內,收集器在工作時會調整Java堆大小或者其他一些參數。
? ? 對于用戶來講,停頓時間越短體驗越好。但是在服務器端,我們注重高并發,整體的吞吐量。所以服務器端適合Parallel,進行控制。
? ? 該參數使用需謹慎。
· -XX:GCTimeRatio?垃圾收集時間占總時間的比例(=1 / (N + 1))用于衡量吞吐量的大小。
? ? 取值范圍(0, 100)。默認值99,也就是垃圾回收時間不超過1%。
? ? 與前一個-XX:MaxGCPauseMillis參數有一定的矛盾性。暫停時間越長,Radio參數就容易超過設定的比例。
· -XX:+UseAdaptiveSizePolicy?設置Parallel?Scavenge收集器具有自適應調節策略(默認開啟)。
? ? 在這種模式下,年輕代的大小、Eden和Survivor的比例、晉升老年代的對象年齡等參數會被自動調整,已達到在堆大小、吞吐量和停頓時間之間的平衡點。
? ? 在手動調優比較困難的場合,可以直接使用這種自適應的方式,僅指定虛擬機的最大堆、目標的吞吐量(GCTimeRatio)和停頓時間(MaxGCPauseMills),讓虛擬機自己完成調優工作。
· -XX:+UseConcMarkSweepGC?手動指定使用CMS收集器執行內存回收任務。開啟該參數后會自動將-XX:+UseParNewGC打開。即:ParNew(Young區用)+CMS(Old區用)+Serial?Old的組合。
· -XX:CMSInitiatingOccupanyFraction?設置堆內存使用率的閾值,一旦達到該閾值,便開始進行回收。
? ? JDK5及以前版本的默認值為68,即當老年代的空間使用率達到68%時,會執行一次CMS回收。JDK6及以上版本默認值為92%。
? ? 如果內存增長緩慢,則可以設置一個稍大的值,大的閾值可以有效降低CMS的觸發頻率,減少老年代回收的次數可以較為明顯地改善應用程序性能。反之,如果應用程序內存使用率增長很快,則應該降低這個閾值,以避免頻繁觸發老年代串行收集器。因此通過該選項便可以有效降低Full?GC的執行次數。
· -XX:+UseCMSCompactAtFullCollection?用于指定在執行完Full?GC后對內存空間進行壓縮整理,以此避免內存碎片的產生。不過由于內存壓縮整理過程無法并行執行,所帶來的問題就是停頓時間變得更長了。
· -XX:CMSFullGCsBeforeCompaction?設置在執行多少次Full?GC后對內存空間進行壓縮整理。
· -XX:ParallelCMSThreads?設置CMS的線程數量。CMS默認啟動的線程數是(ParallelGCThreads+3)/4,ParallelGCThreads是年輕代并行收集器的線程數。當CPU資源比較緊張時,受到CMS收集器線程的影響,應用程序的性能在垃圾回收階段可能會非常糟糕。
· -XX:+UseG1GC?手動指定使用G1收集器執行內存回收任務。
· -XX:G1HeapRegionSize?設置每個Region的大小。值是2的冪,范圍是1MB到32MB之間,目標是根據最小的Java堆大小劃分出約2048個區域。默認是堆內存的1/2000。
· -XX:MaxGCPauseMillis?設置期望達到的最大GC停頓時間指標(JVM會盡力實現,但不保證達到)。默認值是200MS。
· -XX:ParallelGCThread?設置STW工作線程數的值。最多設置為8。
· -XX:ConcGCThreads?設置并發標記的線程數。將n設置為并行垃圾回收線程數(ParallelGCThreads)的1/4左右。
· -XX:InitiatingHeapOccupancyPercent?設置觸發并發GC周期的Java堆占用閾值。超過此值,就觸發GC。默認值是45。
六、內存分配與垃圾回收的參數列表
-XX:+PrintGC? ? 輸出GC日志。類似:-verbose:gc
-XX:+PrintGCDetails? ? 輸出GC的詳細日志
-XX:+PrintGCTimeStamps? ? 輸出GC的時間戳(以基準時間的形式)
-XX:+PrintGCDateStamps? ? 輸出GC的時間戳(以日期的形式,如2021-05-05T21:55:55.234+0800)
-XX:+PrintHeapAtGC? ? 在進行GC的前后打印出堆的信息
-Xloggc:../logs/gc.log? ? 日志文件的輸出路徑
-XX:+UnlockExperimentalVMOptions -XX:+UseZGC?使用ZGC
-XX:+TraceClassLoading查看類的加載順序。
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的JVM常用启动参数大全(附带解释)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: springboot-异常处理使用与原理
- 下一篇: springboot启动流程,手把手打断