Java啟動參數(shù)共分為三類;
- 其一是標(biāo)準(zhǔn)參數(shù)(-)效扫,所有的JVM實現(xiàn)都必須實現(xiàn)這些參數(shù)的功能倔监,而且向后兼容;
- 其二是非標(biāo)準(zhǔn)參數(shù)(-X)菌仁,默認(rèn)jvm實現(xiàn)這些參數(shù)的功能浩习,但是并不保證所有jvm實現(xiàn)都滿足,且不保證向后兼容济丘;
- 其三是非Stable參數(shù)(-XX)谱秽,此類參數(shù)各個jvm實現(xiàn)會有所不同,將來可能會隨時取消,需要慎重使用疟赊;
-Xms10m
設(shè)置堆最小值為10M
-Xmx10m
設(shè)置堆最大值為10M
-Xmn10m
設(shè)置年輕代大小為10M
-XX:NewSize和-XX:MaxNewSize
用于設(shè)置年輕代的大小郊供,建議設(shè)為整個堆大小的1/3或者1/4,兩個值設(shè)為一樣大。
-XX:SurvivorRatio=8
年輕代中Eden區(qū)與兩個Survivor區(qū)的比值听绳。注意Survivor區(qū)有兩個颂碘。如:8,表示Eden:Survivor=8:1椅挣,一個Survivor區(qū)占整個年輕代的1/10
-XX:NewRatio=3
設(shè)置年輕代(EC+S0C+S1C)和年老代(OC)的比值头岔。如:為3,表示年輕代與年老代比值為1:3鼠证,年輕代占整個年輕代年老代和的1/4(jdk1.8峡竣,默認(rèn)2)
-XX:InitialTenuringThreshol和-XX:MaxTenuringThreshold
用于設(shè)置晉升到老年代的對象年齡的最小值和最大值,每個對象在堅持過一次Minor GC之后量九,年齡就加1适掰。
-XX:+PrintGCDetails
打印GC的具體信息
-XX:+PrintTenuringDistribution
這個參數(shù)用于顯示每次Minor GC時Survivor區(qū)中各個年齡段的對象的大小。
-XX:+PrintCommandLineFlags
打印傳遞給虛擬機的顯式和隱式參數(shù)(在log日志中第一行就輸出啟動參數(shù))
-XX:+HeapDumpOnOutOfMemoryError
OOM時導(dǎo)出堆到文件
-XX:HeapDumpPath=d:/a.dump
dump出來的數(shù)據(jù)存放在D盤下a.dump中
-XX:OnOutOfMemoryError=D:/printstack.bat %p
%p代表的是當(dāng)前java進(jìn)程的pid 荠列,當(dāng)發(fā)生內(nèi)存溢出的時候執(zhí)行printstack.bat這個腳本类浪,通常可以用作線上內(nèi)存溢出的報警機制肌似,比如發(fā)短信或者郵件通知
-XX:loggc:D:/a.log
將jvm的日志存儲到指定文件
-XX:PretenureSizeThreshold=3M
對象的大小大于3M時將直接進(jìn)入老年代
-XX:-HandlePromotionFailure
在發(fā)送Minor GC之前费就,虛擬機會先檢查老年代最大可用的連續(xù)空間是否大于新生代對象總空間,如果這個條件成立川队,那么Minor GC可用確保是安全的力细,如果不成立,則虛擬機會查看HandlePromotionFailure設(shè)置值是否允許擔(dān)保失敗固额,如果允許眠蚂,會繼續(xù)檢查之前歷次Minor GC中晉升到老年代的平均對象大小是否<老年代最大可用的連續(xù)空間,如果小于斗躏,將嘗試進(jìn)行一次Minor GC逝慧,盡管這次GC是有風(fēng)險的,如果大于或者HandlePromotionFailure設(shè)置不允許冒險瑟捣,那么這時要進(jìn)行一次Full GC
-verbose
-verbose:class 輸出jvm載入類的相關(guān)信息馋艺,當(dāng)jvm報告說找不到類或者類沖突時可此進(jìn)行診斷。
-verbose:gc 輸出每次GC的相關(guān)情況迈套。
-verbose:jni 輸出native方法調(diào)用的相關(guān)情況捐祠,一般用于診斷jni調(diào)用錯誤信息。
-XX:+UseTLAB
默認(rèn)是開啟的桑李,TLAB內(nèi)存空間非常小踱蛀,默認(rèn)占整個Eden區(qū)的1%窿给。
個人建議:不要關(guān)閉!B示堋崩泡!
-XX:+TLABSize
自調(diào)整TLABRefillWasteFraction 閥值
個人建議:不要調(diào)整,采用虛擬機默認(rèn)調(diào)整b颉=亲病!
-XX:TLABRefillWasteFraction
設(shè)置維護進(jìn)入TLAB空間單個對象大小勃痴,比例值谒所,默認(rèn)1/64,對象大于該值會去Eden區(qū)創(chuàng)建沛申。
-XX:TLABWasteTargetPercent
設(shè)置TLAB空間所占用Eden空間的百分比大辛恿臁(打破1%)
-XX:+PrintTLAB
打印TLAB信息
-XX:+UseBiasedLocking
啟用偏向鎖
-XX:BiasedLockingStartupDelay = 0
配合-XX:+UseBiasedLocking參數(shù)使用,一般啟動偏向鎖默認(rèn)是應(yīng)用程序啟動幾秒鐘之后才激活铁材,設(shè)置為0則是關(guān)閉延遲
-XX:PreBlockSpin=10
控制多線程鎖升級到輕量級鎖時尖淘,其中自旋鎖優(yōu)化的自旋次數(shù)
CMS常用參數(shù)
-XX:+UseConcMarkSweepGC
開啟并發(fā)標(biāo)記清除(CMS)收集器
-XX:+UseCMSInitiatingOccupancyOnly
始終基于設(shè)定的閾值,不根據(jù)運行情況進(jìn)行調(diào)整(陷阱)
著觉。
用-XX+UseCMSInitiatingOccupancyOnly標(biāo)志來命令JVM不基于運行時收集的數(shù)據(jù)來啟動CMS垃圾收集周期村生。而是,當(dāng)該標(biāo)志被開啟時饼丘,JVM通過CMSInitiatingOccupancyFraction的值進(jìn)行每一次CMS收集梆造。然而,請記住大多數(shù)情況下葬毫,JVM比我們自己能作出更好的垃圾收集決策。因此屡穗,只有當(dāng)我們充足的理由(比如測試)并且對應(yīng)用程序產(chǎn)生的對象的生命周期有深刻的認(rèn)知時贴捡,才應(yīng)該使用該標(biāo)志。
eg: 如果沒有 -XX:+UseCMSInitiatingOccupancyOnly 這個參數(shù), 只有第一次會使用CMSInitiatingPermOccupancyFraction=68 這個值村砂。JVM后面的情況會自動調(diào)整烂斋。
如果設(shè)置了 -XX:+UseCMSInitiatingOccupancyOnly 這個參數(shù),就會完全參照-XX:CMSInitiatingOccupancyFraction=XX 設(shè)定的值進(jìn)行回收础废,摒棄了JVM自身的優(yōu)化汛骂。
-XX:CMSInitiatingOccupancyFraction=68
使用CMS收集器的情況下,老年代使用了指定閾值的內(nèi)存時评腺,出發(fā)Old GC帘瞭,默認(rèn)是開啟的,TLAB內(nèi)存空間非常小蒿讥,默認(rèn)占整個Eden區(qū)的1%蝶念。
默認(rèn)為68抛腕,即當(dāng)年老代的空間使用率達(dá)到68%時,會執(zhí)行一次CMS回收媒殉。
(陷阱)
如果內(nèi)存使用率增長過快担敌,CMS執(zhí)行Old GC回收??過程中,已經(jīng)出現(xiàn)了內(nèi)存不足的情況廷蓉,此時CMS回收??就會失斎狻(會報錯:Concurrent Mode Failure
),虛擬機會做降級:將啟動SerialOld串行收集器進(jìn)行垃圾回收
桃犬,如果發(fā)生這種場景就會出現(xiàn)STW刹悴,直到垃圾回收結(jié)束??。這樣就會造成應(yīng)用程序停頓時間拉長疫萤。
針對陷阱
的建議:
-如果內(nèi)存增長緩慢:建議將-XX:CMSInitiatingOccupancyFraction設(shè)置可以調(diào)高些颂跨,降低觸發(fā)CMS回收??頻率。
-如果內(nèi)存增長很快:建議將-XX:CMSInitiatingOccupancyFraction設(shè)置值較低些扯饶,可以提前進(jìn)行CMS GC回收??恒削。
G1常用參數(shù)
-XX:+UseG1GC
開啟G1回收器
‐XX:G1HeapRegionSize=2
指定分區(qū)大小(1MB~32MB,且必須是2的冪)
Region大形残颉:總堆的大小/2048(JVM最多可以2048個Region)
-XX:InitiatingHeapOccupancyPercen=45
默認(rèn)值:45% 钓丰,當(dāng)老年代占用整個堆空間45%的時候嘗試觸發(fā)新生代+老年代一起回收的混合回收階段。