JAVA命令行工具(一)--JAVA垃圾回收選項(xiàng)

緊接前一文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)閉闯团。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末辛臊,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子房交,更是在濱河造成了極大的恐慌彻舰,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,590評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件候味,死亡現(xiàn)場(chǎng)離奇詭異刃唤,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)白群,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門透揣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人川抡,你說我怎么就攤上這事辐真。” “怎么了崖堤?”我有些...
    開封第一講書人閱讀 169,301評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵侍咱,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我密幔,道長(zhǎng)楔脯,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,078評(píng)論 1 300
  • 正文 為了忘掉前任胯甩,我火速辦了婚禮昧廷,結(jié)果婚禮上堪嫂,老公的妹妹穿的比我還像新娘。我一直安慰自己木柬,他們只是感情好皆串,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著眉枕,像睡著了一般恶复。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上速挑,一...
    開封第一講書人閱讀 52,682評(píng)論 1 312
  • 那天谤牡,我揣著相機(jī)與錄音,去河邊找鬼姥宝。 笑死翅萤,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的腊满。 我是一名探鬼主播套么,決...
    沈念sama閱讀 41,155評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼糜烹!你這毒婦竟也來了违诗?” 一聲冷哼從身側(cè)響起漱凝,我...
    開封第一講書人閱讀 40,098評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤疮蹦,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后茸炒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體愕乎,經(jīng)...
    沈念sama閱讀 46,638評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評(píng)論 3 342
  • 正文 我和宋清朗相戀三年壁公,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了感论。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,852評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡紊册,死狀恐怖比肄,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情囊陡,我是刑警寧澤芳绩,帶...
    沈念sama閱讀 36,520評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站撞反,受9級(jí)特大地震影響妥色,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜遏片,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評(píng)論 3 335
  • 文/蒙蒙 一嘹害、第九天 我趴在偏房一處隱蔽的房頂上張望撮竿。 院中可真熱鬧,春花似錦笔呀、人聲如沸幢踏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)惑折。三九已至,卻和暖如春枯跑,著一層夾襖步出監(jiān)牢的瞬間惨驶,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工敛助, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留粗卜,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,279評(píng)論 3 379
  • 正文 我出身青樓纳击,卻偏偏與公主長(zhǎng)得像续扔,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子焕数,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • 1.什么是垃圾回收纱昧? 垃圾回收(Garbage Collection)是Java虛擬機(jī)(JVM)垃圾回收器提供...
    簡(jiǎn)欲明心閱讀 89,579評(píng)論 17 311
  • 一 、java虛擬機(jī)底層結(jié)構(gòu)詳解 我們知道堡赔,一個(gè)JVM實(shí)例的行為不光是它自己的事识脆,還涉及到它的子系統(tǒng)、存儲(chǔ)區(qū)域善已、...
    葡萄喃喃囈語(yǔ)閱讀 1,490評(píng)論 0 4
  • Java 虛擬機(jī)有自己完善的硬件架構(gòu), 如處理器灼捂、堆棧、寄存器等换团,還具有相應(yīng)的指令系統(tǒng)悉稠。JVM 屏蔽了與具體操作系...
    尹小凱閱讀 1,695評(píng)論 0 10
  • 簡(jiǎn)生繁,繁于簡(jiǎn)艘包。至簡(jiǎn)是努力的猛,努力回歸本來。簡(jiǎn)約符合思想和生活的要義想虎。思想至簡(jiǎn)卦尊,...
    冰夫閱讀 720評(píng)論 0 0
  • 有人說猫牡,大學(xué)舍友之間的關(guān)系是除了婆媳關(guān)系之外最難處理的料滥,剛?cè)氪髮W(xué)的我并不這樣覺得性穿,以為這句話過分夸大了,但現(xiàn)...
    凌遠(yuǎn)遠(yuǎn)閱讀 173評(píng)論 0 0