垃圾回收知識(shí)總結(jié)

  • JDK1.7/1.8 默認(rèn)的垃圾回收器:Parallel Scavenge(新生代)+ Parallel Old
  • JDK1.9 默認(rèn)垃圾回收器:G1
  • 垃圾回收器參數(shù)
參數(shù) 新生代 老年代
-XX:+UseSerialGC SerialGC Serial Old
-XX:+UseParallelGC Parallel Scavenge Parallel Old
-XX:+UseConcMarkSweepGC ParNew CMS GC憋槐,當(dāng)出現(xiàn)Concurrent Mode Failure時(shí)采用串行GC
-XX:+UseParNewGC ParNew Serial Old
-XX:+UseParallelOldGC Parallel Scavenge ParallelOld
-XX:+UseConcMarkSweepGC -XX:+UseParNewGC Serial GC CMS GC,當(dāng)出現(xiàn)Concurrent Mode Failure或promotion failed采用Serial Old GC
不支持的方式 -XX:+UseParNewGC -XX:+UseParallelOldGC -XX:+UseParNewGC -XX:+UseSerialGC
  • 收集器搭配


    image.png
  • 內(nèi)存分配和回收策略

  1. 對(duì)象首先會(huì)進(jìn)入Eden區(qū)掷匠。
  2. 大對(duì)象直接進(jìn)入老年代僵刮,-XX:PretenureSizeThreshold=n如果對(duì)象的尺寸大于這個(gè)閾值据忘,則直接進(jìn)入老年代。
    注意:這個(gè)參數(shù)只能在ParNewSerial這兩款垃圾收集器起作用搞糕。
  3. 長(zhǎng)期存活的對(duì)象進(jìn)入老年代,-XX:MaxTenuringThreshold 一個(gè)對(duì)象經(jīng)歷過(guò)多少次MinorGC會(huì)進(jìn)入老年代勇吊。默認(rèn)值15
  4. 對(duì)象年齡的動(dòng)態(tài)判斷,如果在Survivor空間中相同年齡所有對(duì)象大小的總和大于Survivor空間的一半窍仰,年齡大于或等于該年齡的對(duì)象就可以直接進(jìn)入老年代汉规,無(wú)須等到MaxTenuringThreshold中要求的年齡。
  5. 空間分配擔(dān)保,HandlePromotionFailure辈赋,檢查老年代最大可用的連續(xù)空間是否大于歷次晉升到老年代對(duì)象的平均大小鲫忍,如果大于膏燕,將嘗試著進(jìn)行一次Minor GC钥屈;如果小于,或者設(shè)置不允許冒險(xiǎn)坝辫,那這時(shí)也要改為進(jìn)行一次Full GC篷就。
    ① 在MinorGC之前,檢查老年代最大可用連續(xù)空間是否大于新生代所有對(duì)象的大小近忙。
    ② 執(zhí)行MinorGC
    ③ 如果空間不夠竭业。
    ④ 檢查HandlePromotionFailure是否開(kāi)啟。
    ⑤ 如果沒(méi)有開(kāi)啟及舍。這個(gè)時(shí)候執(zhí)行Full GC未辆。
    ⑥ 如果這個(gè)參數(shù)開(kāi)啟,檢查檢查老年代最大可用的連續(xù)空間是否大于歷次晉升到老年代對(duì)象的平均大小锯玛。
    ⑦ 如果大于咐柜,試著執(zhí)行MinorGC兼蜈。
    ⑧ 如果小于,執(zhí)行Full GC拙友。
    image.png
內(nèi)存管理參數(shù)
DisableExplicitGC 默認(rèn)關(guān)閉 忽略來(lái)自System.gc()方法觸發(fā)的垃圾收集
ExplicitGCInvokesConcurrent 默認(rèn)關(guān)閉 當(dāng)收到System.gc()方法提交的來(lái)機(jī)收集申請(qǐng)時(shí),使用CMS收集器進(jìn)行收集
UseSerialGC Client模式的虛擬機(jī)默認(rèn)開(kāi)啟,其他模式關(guān)閉 虛擬機(jī)運(yùn)行在Client模式下的默認(rèn)值,打開(kāi)此開(kāi)關(guān)后,使用Serial + Serial Old的收集器組合進(jìn)行內(nèi)存回收
UseParNewGC 默認(rèn)關(guān)閉 打開(kāi)此開(kāi)關(guān)后,使用ParNew + Serial Old的收集器組合進(jìn)行內(nèi)存回收
UseConcMarkSweepGC 默認(rèn)關(guān)閉 打開(kāi)此開(kāi)關(guān)后,使用ParNew + CMS + Serial Old的收集器組合進(jìn)行內(nèi)存回收.如果CMS收集器出現(xiàn)Concurrent Mode Failure,則Serial Old收集器將作為后備收集器
UseParallelGC Server模式的虛擬機(jī)默認(rèn)開(kāi)啟,其他模式關(guān)閉 虛擬機(jī)運(yùn)行在Server模式下的默認(rèn)值,打開(kāi)此開(kāi)關(guān)后,使用Parallel Scavenge + Serial Old的收集器組合進(jìn)行內(nèi)存回收
UseParallelOldGC 默認(rèn)關(guān)閉 打開(kāi)此開(kāi)關(guān)后,使用Parallel Scavenge + Parallel Old的收集器組合進(jìn)行內(nèi)存回收
SurvivorRatio 默認(rèn)為8 新生代中Eden區(qū)域與Survivor區(qū)域的容量比
PretenureSizeThreshold 無(wú)默認(rèn)值 直接晉升到老年代的對(duì)象大小,設(shè)置這個(gè)參數(shù)后,大于這個(gè)參數(shù)的對(duì)象將直接在老年代分配
MaxTenuringThreshold 默認(rèn)值為15 晉升到老年代的對(duì)象年齡,每個(gè)對(duì)象在堅(jiān)持過(guò)一次Minor GC之后,年齡就+1,當(dāng)超過(guò)這個(gè)參數(shù)值時(shí)就進(jìn)入老年代
UseAdaptiveSizePolicy 默認(rèn)開(kāi)啟 動(dòng)態(tài)調(diào)整java堆中各個(gè)區(qū)域的大小及進(jìn)入老年代的年齡
HandlePromotionFailure jdk1.5及以前是默認(rèn)關(guān)閉,jdk1.6默認(rèn)開(kāi)啟 是否允許分配擔(dān)保失敗,即老年代的剩余空間不足以應(yīng)付新生代的整個(gè)Eden和Survivor區(qū)的所有對(duì)象都存活的極端情況
ParallelGCThreads 少于或等于8個(gè)CPU時(shí)默認(rèn)值為CPU數(shù)量值,多于8個(gè)CPU時(shí)比CPU數(shù)量值小 設(shè)置并行GC時(shí)進(jìn)行內(nèi)存回收的線程數(shù)
GCTimeRatio 默認(rèn)值99 GC時(shí)間占總時(shí)間的比率.僅在使用Parallel Scavenge收集器時(shí)生效
MaxGCPauseMills 無(wú)默認(rèn)值 設(shè)置GC最大停頓時(shí)間.僅在使用Parallel Scavenge收集器時(shí)生效
CMSInitiatingOccupancyFraction 默認(rèn)值68 設(shè)置CMS收集器在老年代空間被使用多少后觸發(fā)垃圾收集
UseCMSCompactAtFullCollection 默認(rèn)開(kāi)啟 設(shè)置CMS收集器在完成垃圾收集后是否要進(jìn)行一次內(nèi)存碎片整理
CMSFullGCsBeforeCompaction 無(wú)默認(rèn)值 設(shè)置CMS收集器在進(jìn)行若干次垃圾收集后再啟動(dòng)一次內(nèi)存碎片整理
ScavengeBeforeFullGC 默認(rèn)開(kāi)啟 在Full GC發(fā)生之前觸發(fā)一次Minor GC
UseGCOverheadLimit 默認(rèn)開(kāi)啟 禁止GC過(guò)程無(wú)限制的執(zhí)行,如果過(guò)于頻繁,就直接發(fā)生OutOfMemory
UseTLAB Server模式默認(rèn)開(kāi)啟 優(yōu)先在本地線程緩沖區(qū)中分配對(duì)象,避免分配內(nèi)存時(shí)的鎖定過(guò)程
MaxHeapFreeRatio 默認(rèn)值70 當(dāng)Xmx值比Xms值大時(shí),堆可以動(dòng)態(tài)收縮和擴(kuò)展,這個(gè)參數(shù)控制當(dāng)堆空閑大于指定比率時(shí)自動(dòng)收縮
MinHeapFreeRatio 默認(rèn)值40 當(dāng)Xmx值比Xms值大時(shí),堆可以動(dòng)態(tài)收縮和擴(kuò)展,這個(gè)參數(shù)控制當(dāng)堆空閑小于指定比率時(shí)自動(dòng)收縮
MaxPermSize 大部分情況下默認(rèn)值是64MB 永久代的最大值
即時(shí)編譯參數(shù)
CompileThreshold Client模式下默認(rèn)值1500,Server模式下默認(rèn)值10000 觸發(fā)即時(shí)編譯的閾值
OnStackReplacePercentage Client模式下默認(rèn)值933,Server模式下140 OSR比率,它是OSR即時(shí)編譯閾值計(jì)算公司的一個(gè)參數(shù),用于代替BackEdgeThreshold參數(shù)控制回邊計(jì)數(shù)器的實(shí)際溢出閾值
ReservedCodeCacheSize 大部分情況下默認(rèn)值32MB 即時(shí)編譯器編譯的代碼緩存使得最大值
類(lèi)型加載參數(shù)
UseSplitVerifier 默認(rèn)開(kāi)啟 使用依賴(lài)StackMapTable信息的類(lèi)型檢查代替數(shù)據(jù)流分析,以加快字節(jié)碼校驗(yàn)速度
FailOverToOldVerifier 默認(rèn)開(kāi)啟 當(dāng)類(lèi)型校驗(yàn)失敗時(shí),是否允許回到老的類(lèi)型推到校驗(yàn)方式進(jìn)行校驗(yàn),如果開(kāi)啟則允許
RelaxAccessControlCheck 默認(rèn)開(kāi)啟 在校驗(yàn)階段放松對(duì)類(lèi)型訪問(wèn)性的限制
多線程相關(guān)參數(shù)
UseSpinning jdk1.6默認(rèn)開(kāi)啟,jdk1.5默認(rèn)關(guān)閉 開(kāi)啟自旋鎖以免線程頻繁的掛起和喚醒
PreBolckSpin 默認(rèn)值10 使用自旋鎖時(shí)默認(rèn)的自旋次數(shù)
UseThreadPriorities 默認(rèn)開(kāi)啟 使用本地線程優(yōu)先級(jí)
UseBiasedLocking 默認(rèn)開(kāi)啟 是否使用偏向鎖,如果開(kāi)啟則使用
UseFastAccessorMethods 默認(rèn)開(kāi)啟 當(dāng)頻繁反射執(zhí)行某個(gè)方法時(shí),生成字節(jié)碼來(lái)加快反射的執(zhí)行速度
性能參數(shù)
AggressiveOpts jdk1.6默認(rèn)開(kāi)啟,jdk1.5默認(rèn)關(guān)閉 使用激進(jìn)的優(yōu)化特征,這些特征一般是具備正面和負(fù)面雙重影響的,需要根據(jù)具體應(yīng)用特點(diǎn)分析才能判定是否對(duì)性能有好處
UseLargePage 默認(rèn)開(kāi)啟 如果可能,使用大內(nèi)存分頁(yè),這項(xiàng)特性需要操作系統(tǒng)的支持
LargePageSizeInBytes 默認(rèn)值4MB 使用指定大小的內(nèi)存分頁(yè),這項(xiàng)特性需要操作系統(tǒng)的支持
StringCache 默認(rèn)開(kāi)啟 是否使用字符串緩存,開(kāi)啟則使用
調(diào)試參數(shù)
HeapDumpOnOutOfMemoryError 默認(rèn)關(guān)閉 在發(fā)生內(nèi)存溢出異常時(shí)是否生成堆轉(zhuǎn)儲(chǔ)快照,關(guān)閉則不生成
OnOutOfMemoryError 無(wú)默認(rèn)值 當(dāng)虛擬機(jī)拋出內(nèi)存溢出異常時(shí),執(zhí)行指令的命令
OnError 無(wú)默認(rèn)值 當(dāng)虛擬機(jī)拋出ERROR異常時(shí),執(zhí)行指令的命令
PrintClassHistogram 默認(rèn)關(guān)閉 使用[ctrl]-[break]快捷鍵輸出類(lèi)統(tǒng)計(jì)狀態(tài),相當(dāng)于jmap-histo的功能
PrintConcurrentLocks 默認(rèn)關(guān)閉 打印J.U.C中的狀態(tài)
PrintCommandLineFlags 默認(rèn)關(guān)閉 打印啟動(dòng)虛擬機(jī)時(shí)輸入的非穩(wěn)定參數(shù)
PrintFlagsFinal ---- 顯示所有可設(shè)置的參數(shù)及它們的值(***從JDK 6 update 21開(kāi)始才可以用)
PrintFlagsInitial ---- 顯示在處理參數(shù)之前所有可設(shè)置的參數(shù)及它們的值为狸,然后直接退出程序
PrintCompilation 默認(rèn)關(guān)閉 打印方法即時(shí)編譯信息
PrintGC 默認(rèn)關(guān)閉 打印GC信息
PrintGCDetails 默認(rèn)關(guān)閉 打印GC的詳細(xì)信息
PrintGCTimeStamps 默認(rèn)關(guān)閉 打印GC停頓耗時(shí)
PrintTenuringDistribution 默認(rèn)關(guān)閉 打印GC后新生代各個(gè)年齡對(duì)象的大小
TraceClassLoading 默認(rèn)關(guān)閉 打印類(lèi)加載信息
TraceClassUnloading 默認(rèn)關(guān)閉 打印類(lèi)卸載信息
PrintInlining 默認(rèn)關(guān)閉 打印方法內(nèi)聯(lián)信息
PrintCFGToFile 默認(rèn)關(guān)閉 將CFG圖信息輸出到文件,只有DEBUG版虛擬機(jī)才支持此參數(shù)
PrintIdealGraphFile 默認(rèn)關(guān)閉 將Ideal圖信息輸出到文件,只有DEBUG版虛擬機(jī)才支持此參數(shù)
UnlockDiagnosticVMOptions 默認(rèn)關(guān)閉 讓虛擬機(jī)進(jìn)入診斷模式,一些參數(shù)(如PrintAssembly)需要在診斷模式中才能使用
PrintAssembly 默認(rèn)關(guān)閉 打印即時(shí)編譯后的二進(jìn)制信息
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市遗契,隨后出現(xiàn)的幾起案子辐棒,更是在濱河造成了極大的恐慌,老刑警劉巖牍蜂,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件漾根,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡鲫竞,警方通過(guò)查閱死者的電腦和手機(jī)立叛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)贡茅,“玉大人秘蛇,你說(shuō)我怎么就攤上這事《タ迹” “怎么了赁还?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)驹沿。 經(jīng)常有香客問(wèn)我艘策,道長(zhǎng),這世上最難降的妖魔是什么渊季? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任朋蔫,我火速辦了婚禮,結(jié)果婚禮上却汉,老公的妹妹穿的比我還像新娘驯妄。我一直安慰自己,他們只是感情好合砂,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布青扔。 她就那樣靜靜地躺著,像睡著了一般翩伪。 火紅的嫁衣襯著肌膚如雪微猖。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,144評(píng)論 1 285
  • 那天缘屹,我揣著相機(jī)與錄音凛剥,去河邊找鬼。 笑死轻姿,一個(gè)胖子當(dāng)著我的面吹牛犁珠,可吹牛的內(nèi)容都是我干的傅瞻。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼盲憎,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼嗅骄!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起饼疙,我...
    開(kāi)封第一講書(shū)人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤溺森,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后窑眯,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體屏积,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年磅甩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了炊林。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡卷要,死狀恐怖渣聚,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情僧叉,我是刑警寧澤奕枝,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站瓶堕,受9級(jí)特大地震影響隘道,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜郎笆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一谭梗、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧宛蚓,春花似錦激捏、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)壹置。三九已至竞思,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間钞护,已是汗流浹背盖喷。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留难咕,地道東北人课梳。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓距辆,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親暮刃。 傳聞我的和親對(duì)象是個(gè)殘疾皇子跨算,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

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