緊接前一文JAVA命令行工具(一)--JAVA魄咕,垃圾回收由于有較多選項(xiàng),所以單獨(dú)成篇蚌父,關(guān)于選項(xiàng)的通用描述可參見前文哮兰。
1 通用參數(shù)
-XX:InitialHeapSize=size
??設(shè)置Java堆的初始大小,同-Xms
苟弛。
-XX:MaxHeapSize=size
??設(shè)置Java堆的最大大小喝滞,同-Xmx
。
-XX:NewSize=size
??設(shè)置新生代的初始大小嗡午,同-Xmn
囤躁。
-XX:MaxNewSize=size
??設(shè)置新生代的最大大小冀痕,默認(rèn)值自動(dòng)設(shè)置荔睹。
-XX:MetaspaceSize=size
??設(shè)置Java類元數(shù)據(jù)空間觸發(fā)垃圾回收的閾值狸演,當(dāng)使用的類元數(shù)據(jù)所占的空間首次超過該值將觸發(fā)垃圾回收。該閾值會(huì)隨著類元數(shù)據(jù)所占空間的變化而變化僻他,其默認(rèn)值取決于具體的操作系統(tǒng)宵距。
-XX:MaxMetaspaceSize=size
??設(shè)置存儲(chǔ)Java類元數(shù)據(jù)的最大空間,默認(rèn)沒有限制吨拗。
-XX:NewRatio=ratio
??設(shè)置新生代和老年代的相對(duì)大小满哪。該選項(xiàng)的默認(rèn)值為2,表示新生代和老年代的比率為2:1即新生代占整個(gè)堆的2/3劝篷,老年代占整個(gè)堆的1/3哨鸭。這種設(shè)置方式的優(yōu)點(diǎn)是:新生代的大小隨著堆大小的改變而改變。該選項(xiàng)和設(shè)置絕對(duì)大小的選項(xiàng)一起使用將同時(shí)生效娇妓,如下的選項(xiàng)設(shè)置:
-XX:NewSize=32m -XX:MaxNewSize=512m -XX:NewRatio=3
JVM會(huì)嘗試為新生代分配1/4的堆大小像鸡,但不會(huì)小于32MB,也不會(huì)大于512MB哈恰。
-XX:SurvivorRatio=ratio
??設(shè)置Survivor和Eden的相對(duì)大小只估,該選項(xiàng)作用于新生代內(nèi)部。為了明白該選項(xiàng)的含義着绷,需要了解新生代的空間劃分蛔钙,一個(gè)簡(jiǎn)單的示意如下:
| Eden | From(S0) | To(S1) | // Trom和To都是Survivor且大小相同
該選項(xiàng)表示Eden區(qū)和兩個(gè)Surivior區(qū)的比率,默認(rèn)值為8荠医,即各區(qū)的比例為Eden:S0:S1=8:1:1吁脱。如果Eden區(qū)過大,在一次GC后幸存的對(duì)象過多以至于Survivor區(qū)不能容納子漩,那么大部分對(duì)象在一次GC后就會(huì)轉(zhuǎn)移到老年代豫喧;如果Eden區(qū)過小,意味著新對(duì)象的產(chǎn)生將很快耗盡Eden區(qū)幢泼,從而增加新生代GC次數(shù)紧显。
-XX:TargetSurvivorRatio=percent
??設(shè)置Survivor區(qū)的使用率,當(dāng)Surviivor的使用率達(dá)到該值時(shí)缕棵,JVM將會(huì)動(dòng)態(tài)調(diào)節(jié)新生代對(duì)象晉升到老年代對(duì)象的年齡閾值孵班,從而讓年齡過大的對(duì)象盡早轉(zhuǎn)移到老年代。默認(rèn)值為50招驴,表示允許50%的Survivor空間被使用篙程。
-XX:+UseAdaptiveSizePolicy
??允許JVM動(dòng)態(tài)調(diào)節(jié)新生代各區(qū)的大小。該選項(xiàng)默認(rèn)開啟别厘,如果需要關(guān)閉虱饿,需要顯式指定新生代各區(qū)的大小,可參考-XX:SurvivorRatio
。
-XX:MaxTenuringThreshold=threshold
??設(shè)置新生代晉升到老年代的年齡閾值氮发,當(dāng)新生代對(duì)象的年齡超過該閾值時(shí)將被轉(zhuǎn)移到老年代渴肉。該選項(xiàng)的默認(rèn)值隨收集器不同而不同,并行收集器默認(rèn)15爽冕,CMS收集器默認(rèn)為6仇祭。由于該值用4個(gè)bit存儲(chǔ)在JAVA對(duì)象頭中,故該選項(xiàng)的最大值為15颈畸。
-XX:+AggressiveHeap
??開啟Java堆優(yōu)化乌奇,根據(jù)計(jì)算機(jī)的配置(CPU和內(nèi)存)設(shè)置大量參數(shù)用于優(yōu)化長(zhǎng)時(shí)間運(yùn)行任務(wù)的內(nèi)存分配。該選項(xiàng)默認(rèn)關(guān)閉眯娱。
??在非官方文檔中礁苗,有說明該選項(xiàng)將使JVM盡可能多的占用物理內(nèi)存,并使-Xmx
選項(xiàng)失效徙缴;根據(jù)該選項(xiàng)英文名猜測(cè)可能有此種含義寂屏,還需確認(rèn),歡迎在評(píng)論中指出和討論娜搂。
-XX:MaxHeapFreeRatio=percent
??設(shè)置一次GC后Java堆允許空閑的最大比率迁霎,如果空閑堆空間超過該選項(xiàng)指定的比率,Java堆空間將縮小百宇。默認(rèn)情況下考廉,該選項(xiàng)的值為70,表示允許70%的空閑携御。
-XX:MinHeapFreeRatio=percent
??設(shè)置一次GC后Java堆允許空閑的最小比率昌粤,如果空間堆空間小于該選項(xiàng)指定的比率,Java堆空間將擴(kuò)大啄刹。默認(rèn)情況下涮坐,該選項(xiàng)的值為40%,表示至少需要40%的空閑誓军。
-XX:+ShrinkHeapInSteps
??使Java堆漸進(jìn)地縮小到目標(biāo)大小袱讹,該選項(xiàng)默認(rèn)開啟,經(jīng)過多次GC后堆縮小到目標(biāo)大嘘鞘薄捷雕;如果關(guān)閉該選項(xiàng),那么GC后Java堆將立即縮小到目標(biāo)大小壹甥。如果希望最小化Java堆大小救巷,可以關(guān)閉改選項(xiàng),并配合以下選項(xiàng):
-XX:MaxHeapFreeRatio=10 -XX:MinHeapFreeRatio=5
這樣將保持Java堆空間較小句柠,并減少程序的動(dòng)態(tài)占用空間浦译,這對(duì)嵌入式應(yīng)用非常有用棒假,但對(duì)于一般應(yīng)用,可能降低性能精盅。
-XX:MaxGCPauseMillis=time
??設(shè)置GC停頓的最大時(shí)間淆衷,單位毫秒。該選項(xiàng)為GC設(shè)定一個(gè)目標(biāo)優(yōu)化值渤弛,JVM將盡可能完成該目標(biāo),但并不保證一定完成甚带。最新版本的JDK沒有設(shè)置最大值她肯,JDK8設(shè)定默認(rèn)值為200毫秒。
-XX:+Scavenge BeforeFullGC
??執(zhí)行Full GC前首先執(zhí)行新生代的GC鹰贵,該選項(xiàng)默認(rèn)開啟晴氨。官方強(qiáng)烈建議開啟改選項(xiàng),因?yàn)樵贔ull GC前對(duì)新生代執(zhí)行Scavenge GC可以減少晉升到老年代的對(duì)象碉输。
-XX:+ParallelRefProcEnabled
??啟用并行處理引用功能籽前,開啟該選項(xiàng)后,將使用多線程并行處理引用敷钾,該選項(xiàng)默認(rèn)關(guān)閉枝哄。
-XX:+DisableExplicitGC
??該選項(xiàng)關(guān)閉調(diào)用System.gc()
方法的處理,默認(rèn)關(guān)閉該選項(xiàng)阻荒,也就是說挠锥,默認(rèn)將會(huì)處理System.gc()
方法。注意侨赡,不處理System.gc()
調(diào)用蓖租,但JVM仍然會(huì)在合適的時(shí)候進(jìn)行GC。
2 并行GC參數(shù)
以下這些參數(shù)適用于并行GC羊壹,即ParallelGC和ParallelOldGC蓖宦,啟用并行GC回收器,可使用選項(xiàng)-XX:+UseParallelGC和-XX:+UseParallelOldGC油猫。
-XX:InitialSurvivorRatio=ratio
??該選項(xiàng)與-XX:SurvivorRatio
含義相同稠茂,設(shè)置新生代的Eden區(qū)和Survivor區(qū)的比例,默認(rèn)值同樣為8情妖,表示10M的新生代主慰,將初始化8M的Eden區(qū)和兩個(gè)1M的Survivor區(qū)。該選項(xiàng)只適用于并行GC鲫售,如果并行GC同樣配置了-XX:SurvivorRatio
共螺,則優(yōu)先以本選項(xiàng)為準(zhǔn)。
-XX:+UseGCOverheadLimit
??在JVM拋出OutOfMemoryError
異常之前情竹,允許限制JVM花費(fèi)在GC上的時(shí)間比率藐不。默認(rèn)情況下,該選項(xiàng)開啟,如果花費(fèi)超過98%的時(shí)間進(jìn)行垃圾回收但回收的堆空間小于2%雏蛮,將會(huì)拋出OutOfMemoryError
異常(僅對(duì)parallel GC有用)涎嚼。當(dāng)堆空間很小時(shí),可以使用該特性來阻止應(yīng)用長(zhǎng)時(shí)間不處理請(qǐng)求或處理進(jìn)度過低挑秉。
-XX:ParallelGCThreads=n
??設(shè)置STW工作線程的數(shù)量法梯。如果邏輯處理器的數(shù)量不超過8,該值設(shè)置為與邏輯處理器數(shù)量相同犀概;如果邏輯處理器數(shù)量大于8立哑,則一般設(shè)置為邏輯處理器數(shù)量的5/8。該選項(xiàng)的默認(rèn)值取決于JVM可用的CPU數(shù)量姻灶。
3 并發(fā)GC參數(shù)
以下這些參數(shù)使用于并發(fā)GC铛绰,即G1 GC和ConcMarkSweepGC,啟用并發(fā)GC回收器产喉,可使用選項(xiàng)-XX:+UseG1GC和-XX:+UseConcMarkSweepGC捂掰。
-XX:ConcGCThreads=threads
??設(shè)置并發(fā)GC的線程數(shù)。一般將該值設(shè)置為并行GC線程數(shù)(由ParallelGCThreads
指定)的1/4曾沈。該選項(xiàng)的默認(rèn)值取決于JVM可用的CPU數(shù)量这嚣。
-XX:InitiatingHeapOccupancyPercent=percent
??設(shè)置開始并發(fā)GC的堆使用率閾值,當(dāng)整個(gè)堆的使用率達(dá)到該選項(xiàng)指定的值塞俱,將觸發(fā)一次并發(fā)GC疤苹。該選項(xiàng)的默認(rèn)值為45,即堆使用率達(dá)到45%后敛腌,開始進(jìn)行并發(fā)GC卧土。
-XX:+ExplicitGCInvokesConcurrent
??啟用System.gc()
方法調(diào)用并發(fā)GC的功能,該選項(xiàng)默認(rèn)關(guān)閉像樊。
3.1 G1 GC選項(xiàng)
-XX:G1HeapRegionSize=size
??設(shè)置Java堆劃分為Region區(qū)的大小尤莺。該選項(xiàng)的值需要為2的次數(shù),且介于[1MB生棍,32MB]之間颤霎,目標(biāo)是將Java堆劃分為約2048個(gè)Region區(qū)。該選項(xiàng)的默認(rèn)值由JVM根據(jù)Java堆大小自動(dòng)計(jì)算涂滴。
-XX:G1HeapWastePercent=percent
??設(shè)置希望浪費(fèi)的Java堆比例友酱。當(dāng)可回收的空間小于該選項(xiàng)設(shè)置的比例時(shí),JVM不會(huì)進(jìn)行混合(Mixed)垃圾回收柔纵。該選項(xiàng)的默認(rèn)值是5缔杉。
-XX:G1ReservePercent=percent
??設(shè)置Java堆的保留空間占比,以便對(duì)可能的晉升(新生代晉升老年代)失敗進(jìn)行容錯(cuò)處理搁料。該選項(xiàng)的默認(rèn)值是10或详,可設(shè)置的區(qū)間為[0,50]系羞。
-XX:+UseStringDeduplication
??啟用字符串去重功能。該選項(xiàng)默認(rèn)關(guān)閉霸琴,開啟該選項(xiàng)將會(huì)減少字符串占用的內(nèi)存空間椒振。這是因?yàn)閱⒂迷摴δ芎螅绻麅蓚€(gè)字符串含有相同的底層字符數(shù)組梧乘,那么這兩個(gè)字符串將會(huì)共享相同的底層字符數(shù)組澎迎。
–XX:StringDeduplicationAgeThreshold=threshold
??設(shè)置進(jìn)行去重的字符串在GC中的年齡閾值。大部分字符串對(duì)象生命周期都很短选调,如果盲目去重將浪費(fèi)CPU資源夹供。對(duì)多次GC之后仍然存活的字符串對(duì)象進(jìn)行去重才是較好的選擇。該選項(xiàng)的默認(rèn)值是3学歧,此外,Old區(qū)的字符創(chuàng)對(duì)象則會(huì)一直進(jìn)行去重各吨。
以下的選項(xiàng)都是實(shí)驗(yàn)性質(zhì)的選項(xiàng)枝笨,需要在HotSpot VM build 23之后才可使用。
-XX:G1MaxNewSizePercent=percent
??設(shè)置新生代在Java堆的最大占比揭蜒,該選項(xiàng)的默認(rèn)值為60横浑,且會(huì)覆蓋-XX:DefaultMaxNewGenPercent選項(xiàng)。
-XX:G1MixedGCLiveThresholdPercent=percent
??設(shè)置Old區(qū)在混合垃圾回收中的占比屉更,該選項(xiàng)的默認(rèn)值為85徙融,且會(huì)覆蓋-XX:G1OldCSetRegionLiveThresholdPercent選項(xiàng)。
-XX:G1MixedGCCountTarget=number
??設(shè)置標(biāo)記周期完成后瑰谜,對(duì)存活數(shù)據(jù)上限為G1MixedGCLIveThresholdPercent
的OLd區(qū)執(zhí)行混合垃圾回收的目標(biāo)次數(shù)欺冀。默認(rèn)值是8,混合回收的目標(biāo)是要控制在此目標(biāo)次數(shù)以內(nèi)萨脑。
-XX:G1NewSizePercent=percent
??設(shè)置新生代在Java堆的最小占比隐轩,該選項(xiàng)的默認(rèn)值是5。
-XX:G1OldCSetRegionThresholdPercent=percent
??設(shè)置混合回收期間回收Old區(qū)的最大數(shù)量渤早,該選項(xiàng)的默認(rèn)值是10职车。
3.2 CMS GC選項(xiàng)
-XX:+CMSClassUnloadingEnabled
??啟用類卸載功能,該選項(xiàng)默認(rèn)開啟鹊杖。
-XX:+CMSScavengeBeforeRemark
??啟用CMS在重新標(biāo)記階段之前的清除嘗試悴灵,該選項(xiàng)默認(rèn)開啟,即在Remark階段之前進(jìn)行一次Young GC以便減少remark的耗時(shí)骂蓖。
-XX:CMSInitiatingOccupancyFraction=percent
??設(shè)置觸發(fā)CMS回收的老年代空間占比积瞒,即當(dāng)老年代占用空間超過該選項(xiàng)指定的值,那么進(jìn)行一次CMS回收登下。該選項(xiàng)的默認(rèn)值為-1赡鲜,此時(shí)該閾值由以下公式確定:
occupancyFraction = ((100 - MinHeapFreeRatio) + (double)( CMSTriggerRatio * MinHeapFreeRatio) / 100.0) / 100.0
默認(rèn)情況下空厌,MinHeapFreeRatio
的值為40,CMSTriggerRatio
的值為80银酬,帶入該公式嘲更,結(jié)果為92%,即默認(rèn)情況揩瞪,老年代達(dá)到92%時(shí)觸發(fā)CMS回收赋朦。該選項(xiàng)在JDK10中已被標(biāo)記為Deprecated
。
-XX:CMSTriggerRatio=percent
??與選項(xiàng)-XX:MinHeapFreeRatio一起用于計(jì)算觸發(fā)CMS回收的條件值李破,該選項(xiàng)的默認(rèn)值為80宠哄。
-XX:+UseCMSInitiatingOccupancyOnly
??將老年代占比閾值設(shè)定為觸發(fā)CMS回收的唯一條件。該選項(xiàng)默認(rèn)關(guān)閉嗤攻,JVM通過收集運(yùn)行時(shí)數(shù)據(jù)等綜合因素觸發(fā)垃圾回收毛嫉,僅在第一次垃圾回收時(shí)使用老年代占比閾值。除非對(duì)應(yīng)用產(chǎn)生的對(duì)象生命周期有深刻認(rèn)識(shí)妇菱,才應(yīng)該啟用該選項(xiàng)承粤。
-XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses
啟用System.gc()
方法調(diào)用并發(fā)GC和卸載類的功能,該選項(xiàng)默認(rèn)關(guān)閉闯团。