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