- 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 |
-
收集器搭配
內(nèi)存分配和回收策略
- 對(duì)象首先會(huì)進(jìn)入
Eden
區(qū)掷匠。 - 大對(duì)象直接進(jìn)入老年代僵刮,
-XX:PretenureSizeThreshold=n
如果對(duì)象的尺寸大于這個(gè)閾值据忘,則直接進(jìn)入老年代。
注意:這個(gè)參數(shù)只能在ParNew
和Serial
這兩款垃圾收集器起作用搞糕。 - 長(zhǎng)期存活的對(duì)象進(jìn)入老年代,
-XX:MaxTenuringThreshold
一個(gè)對(duì)象經(jīng)歷過(guò)多少次MinorGC
會(huì)進(jìn)入老年代勇吊。默認(rèn)值15 - 對(duì)象年齡的動(dòng)態(tài)判斷,如果在
Survivor
空間中相同年齡所有對(duì)象大小的總和大于Survivor
空間的一半窍仰,年齡大于或等于該年齡的對(duì)象就可以直接進(jìn)入老年代汉规,無(wú)須等到MaxTenuringThreshold
中要求的年齡。 - 空間分配擔(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
拙友。
內(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)制信息 |