深刻理解Java虚拟机笔记之五GC日志和垃圾收集器参数

GC日志

[GC (Allocation Failure) [PSYoungGen: 5632K->496K(6144K)] 5632K->2985K(19968K), 0.0061449 secs] [Times: user=0.02 sys=0.00, real=0.00 secs] 
[GC (Allocation Failure) [PSYoungGen: 6128K->512K(6144K)] 8617K->7656K(19968K), 0.0066923 secs] [Times: user=0.04 sys=0.01, real=0.00 secs] 
[Full GC (Ergonomics) [PSYoungGen: 6144K->0K(6144K)] [ParOldGen: 10309K->12187K(13824K)] 16453K->12187K(19968K), [Metaspace: 3288K->3288K(1056768K)], 0.1817402 secs] [Times: user=0.33 sys=0.01, real=0.18 secs] 
[Full GC (Ergonomics) [PSYoungGen: 4227K->2629K(6144K)] [ParOldGen: 12187K->13610K(13824K)] 16414K->16239K(19968K), [Metaspace: 3288K->3288K(1056768K)], 0.1551767 secs] [Times: user=0.39 sys=0.01, real=0.16 secs] 
[Full GC (Allocation Failure) [PSYoungGen: 2629K->2629K(6144K)] [ParOldGen: 13610K->13592K(13824K)] 16239K->16222K(19968K), [Metaspace: 3288K->3288K(1056768K)], 0.0977081 secs] [Times: user=0.43 sys=0.01, real=0.10 secs] 

复制代码

GC日志开头的“[GC”和“[Full GC”说明了此次垃圾收集的停顿类型,而不是用来区分新生代GC仍是老年代GC的。若是有“full”,说明此次GC是发生了Stop The World的,例以下面这段新生代收集器ParNew的日志也会出现“Full GC”,这通常是由于出现了分配担保失败之类的问题,因此才致使STW。若是是调用System.gc()方法所触发的收集,那么在这里将显示“[Full GC(System)”。linux

[Full GC 283.736:[ParNew:261599K->261599K(261952K),0.0000288 secs]bash

接下来“[DefNew”、“[Tenured”、“[Perm”、“[PSYoungGen”表示GC发生的区域,这里显示的区域名称与使用的GC收集器是密切相关的,例如Serial收集器为“[DefNew”,ParNew收集器为“[ParNew”,若是是Parallel Scavenge收集器,那它配套的新生代为“PSYoungGen”,老年代和永久代同理,名称也是由收集器决定的。多线程

后面方括号内部的“5632K->496K(6144K)” 含义是“GC前该内存区域已使用容量->GC后该内存区域已使用容量(该内存区域总容量)”。spa

而在方括号以外的“5632K->2985K(19968K)”表示“GC前Java堆已使用容量->GC后Java堆已使用容量(Java堆总容量)”线程

再日后,“0.0061449 secs”表示该内存区域GC所占用的时间,单位是秒。“[Times: user=0.02 sys=0.00, real=0.00 secs] ”,这里面的user、sys、和real与linux的time命令所输出的时间含义一致,分别表明用户态消耗的CPU时间、内核态消耗的CPU时间和操做从开始到结束所经历过的墙钟时间。CPU时间与墙钟时间的区别是,墙钟时间包括各类非运算的等待耗时,例如等待磁盘IO,等待线程阻塞,而CPU时间不包括这些耗时,但当系统有多CPU或者多核的话,多线程操做会叠加这些CPU时间,因此user或者sys时间超过real时间是彻底正常的。日志

垃圾收集器参数总结

参数 描述
UseSerial 虚拟机运行在Client模式下的默认值,打开此开关后,使用Serial+Serial Old 的收集器组合进行内存回收
UseParNewGC 打开此开关后,使用ParNew+Serial Old的收集器组合进行内存回收
UseConcMarkSweepGC 打开此开关后,使用ParNew+CMS+Serial Old的收集器组合进行内存回收。Serial Old收集器将做为CMS收集器出现Concurrent Mode Failure失败后的后备收集器使用
UseParallelGC 虚拟机运行在Server模式下的默认值,打开此开关后,使用Parallel Scavenge+Serial Old(Ps Mark Sweep)的收集器组合进行内存回收
UseParllelOldGC 打开此开关后,使用Parallel Scavenge+Parallel Old 的收集器组合进行内存回收
SurvivorRatio 新生代中Eden区域与Survivor区域的容量比值,默认为8,表明Eden:Survivor = 8:1
PretenureSizeThreshold 直接晋升到老年代的对象大小,设置这个参数后,大于这个参数的对象将直接在老年代分配
MaxTenuringThreshold 晋升到老年代的对象年龄。每一个对象在坚持过一次Minor GC以后,年龄就+1,当超过这个参数值时就进入老年代
UseAdaptiveSizePolicy 动态调整Java堆中各个区域的大小以及进入老年代的年龄
HandlePromotionFailure 是否容许分配担保失败,即老年代的剩余空间不足以应付新生代的整个Eden和Survivor区的全部对象都存活的极端状况
ParallelGCThreads 设置并行GC时进行内存回收的线程数
GCTimeRatio GC时间占总时间的比率,默认为99,即容许1%的GC时间。仅在使用Parallel Scavenge收集器时生效
MaxGCPauseMillis 设置GC的最大停顿时间。仅在使用Parallel Scavenge收集器时生效
CMSInitiatingOccupancyFraction 设置CMS收集器在老年代空间被使用多少后触发垃圾收集。默认值为68%。仅在使用CMS收集器时生效
UseCmsCompactAtFullCollection 设置CMS收集器在完成垃圾收集后是否要进行一次内存碎片整理。仅在使用CMS收集器时生效
CMSFullGCsBeforeCompaction 设置CMS收集器在进行若干次垃圾收集后再启动一次内存碎片整理。仅在使用CMS收集器时生效
相关文章
相关标签/搜索