垃圾收集器與內(nèi)存分配策略(五)——垃圾日志與常見參數(shù)
理解GC日志
創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供
察哈爾右翼前網(wǎng)站建設、察哈爾右翼前做網(wǎng)站、察哈爾右翼前網(wǎng)站設計、察哈爾右翼前網(wǎng)站制作等企業(yè)網(wǎng)站建設、網(wǎng)頁設計與制作、察哈爾右翼前企業(yè)網(wǎng)站模板建站服務,十多年
察哈爾右翼前做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡服務。
每個收集器的日志格式都可以不一樣,但各個每個收集器的日志都維持一定的共性。如下面二段日志:
33.125: [GC [DefNew: 3324K->152K(3712K), 0.0025925 secs] 3324K->152K(11904K), 0.0031680 secs] 100.667: [Full GC [Tenured: 0K->210K(10240K), 0.0149142 secs] 4603K->210K(19456K), [Perm : 2999K->2999K(21248K)], 0.0150007 secs] [Times: user=0.01 sys=0.00, real=0.02 secs]
最前面的數(shù)字“33.125:”和“100.667:”代表了GC發(fā)生的時間,這個數(shù)字的含義是從Java虛擬機啟動以來經(jīng)過的秒數(shù)。 GC和Full GC說明此次垃圾垃圾收集停頓的類型。如果有“Full”說明這次GC是發(fā)生了Stop-The-World的。如果是調(diào)用System.gc()方法觸發(fā)的收集,那么這里將顯示“[ Full GC(System) ]” 接下來的“[DefNew”、“[Tenured”、“[Perm”表示GC發(fā)生的區(qū)域,這里顯示的區(qū)域名稱與使用的GC收集器是密切相關(guān)的。
(1).上面樣例所使用的Serial收集器中的新生代名為“Default New Generation”,所以顯示的是“[DefNew ]”。
(2).如果是ParNew收集器,新生代名稱就會變?yōu)?ldquo;[ParNew”,意為“Parallel New Generation”。
(3).如果采用Parallel Scavenge收集器,那它配套的新生代稱為“PSYoungGen”,老年代和永久代同理,名稱也是由收集器決定的。 .后面方括號內(nèi)部的“3324K->152K(3712K)”含義是“GC前該內(nèi)存區(qū)域已使用容量-> GC后該內(nèi)存區(qū)域已使用容量 (該內(nèi)存區(qū)域總?cè)萘?”。 而在方括號之外的“3324K->152K(11904K)”表示“GC前Java堆已使用容量 -> GC后Java堆已使用容量 (Java堆總?cè)萘?”。 再往后,“0.0025925 secs”表示該內(nèi)存區(qū)域GC所占用的時間,單位是秒。
下面這段新生代收集器ParNew的日志也會出現(xiàn)“[Full GC”(這一般是因為出現(xiàn)了分配擔保失敗之類的問題,所以才導致STW)。
[Full GC 283.736: [ParNew: 261599K->261599K(261952K), 0.0000288 secs]
垃圾收集參數(shù)總結(jié)
-XX:+< option > 啟用選項
-XX:-< option > 不啟用選項
-XX:< option > = < number >
-XX:< option > = < string >
參數(shù) 描述 -XX:+UseSerialGC Jvm運行在Client模式下的默認值,打開此開關(guān)后,使用Serial + Serial Old的收集器組合進行內(nèi)存回收 -XX:+UseParNewGC 打開此開關(guān)后,使用ParNew + Serial Old的收集器進行垃圾回收 -XX:+UseConcMarkSweepGC 使用ParNew + CMS + Serial Old的收集器組合進行內(nèi)存回收,Serial Old作為CMS出現(xiàn)“Concurrent Mode Failure”失敗后的后備收集器使用。 -XX:+UseParallelGC Jvm運行在Server模式下的默認值,打開此開關(guān)后,使用Parallel Scavenge + Serial Old的收集器組合進行回收 -XX:+UseParallelOldGC 使用Parallel Scavenge + Parallel Old的收集器組合進行回收 -XX:SurvivorRatio 新生代中Eden區(qū)域與Survivor區(qū)域的容量比值,默認為8,代表Eden:Subrvivor = 8:1 -XX:PretenureSizeThreshold 直接晉升到老年代對象的大小,設置這個參數(shù)后,大于這個參數(shù)的對象將直接在老年代分配 -XX:MaxTenuringThreshold 晉升到老年代的對象年齡,每次Minor GC之后,年齡就加1,當超過這個參數(shù)的值時進入老年代 -XX:UseAdaptiveSizePolicy 動態(tài)調(diào)整java堆中各個區(qū)域的大小以及進入老年代的年齡 -XX:+HandlePromotionFailure 是否允許新生代收集擔保,進行一次minor gc后, 另一塊Survivor空間不足時,將直接會在老年代中保留 -XX:ParallelGCThreads 設置并行GC進行內(nèi)存回收的線程數(shù) -XX:GCTimeRatio GC時間占總時間的比列,默認值為99,即允許1%的GC時間,僅在使用Parallel Scavenge 收集器時有效 -XX:MaxGCPauseMillis 設置GC的停頓時間,在Parallel Scavenge 收集器下有效 -XX:CMSInitiatingOccupancyFraction 設置CMS收集器在老年代空間被使用多少后出發(fā)垃圾收集,默認值為68%,僅在CMS收集器時有效,-XX:CMSInitiatingOccupancyFraction=70 -XX:+UseCMSCompactAtFullCollection 由于CMS收集器會產(chǎn)生碎片,此參數(shù)設置在垃圾收集器后是否需要一次內(nèi)存碎片整理過程,僅在CMS收集器時有效 -XX:+CMSFullGCBeforeCompaction 設置CMS收集器在進行若干次垃圾收集后再進行一次內(nèi)存碎片整理過程,通常與UseCMSCompactAtFullCollection參數(shù)一起使用 -XX:+UseFastAccessorMethods 原始類型優(yōu)化 -XX:+DisableExplicitGC 是否關(guān)閉手動System.gc -XX:+CMSParallelRemarkEnabled 降低標記停頓 -XX:LargePageSizeInBytes 內(nèi)存頁的大小不可設置過大,會影響Perm的大小,-XX:LargePageSizeInBytes=128m
Client、Server模式默認GC
新生代GC方式 老年代和持久帶GC方式 Client Serial串行GC Serial Old串行GC Server Parallel Scavenge 并行回收GC Parallel Old 并行GC
Sun/Oracle JDK GC組合方式