一、背景
java8的垃圾回收器一般推荐的是parNew+CMS,分别针对新生代和老年代的垃圾回收器。实际生产上,有时需要分析GC日志,检查GC回收有没有引起过多的系统暂停,特别是full GC。
二、如何添加jvm参数启动GC日志
直接上个例子,再解释。
-verbose:gc -Xloggc:/var/log/xxx/gc-xxx.log -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=1024k
参数解释:
-verbose:gc : 启用GC日志
-Xloggc: : GC日志文件路径,注意日志路径需要JVM启动用户拥有读写权限。上面的例子中,可以使用chmod或chown命令对/var/log/xxx/进行赋权限或改变所属用户。
-XX:+PrintGCTimeStamps : 日志格式,打印GC发生的时间戳,这个时间戳表示 JVM 启动后到现在所逝去的时间。
-XX:+PrintGCDateStamps : 日志格式,打印GC发生的系统时间。
-XX:+PrintGCDetails : 打印详细的GC日志
-XX:+UseGCLogFileRotation : 启动GC日志滚动策略
-XX:NumberOfGCLogFiles : GC日志文件滚动数量
-XX:GCLogFileSize : GC日志文件大小
三、GC日志解读
简单看一下新生代和老年代发生GC时的日志是什么样子的。
在看具体的日志之前,先来明确一些名词,并回顾一下java8中的堆存结构与GC。
3.1 名词解释
STW : stop-the-world,意思是系统暂停,或者说jvm中GC相关线程以外的所有应用线程全部暂停,所以叫世界暂停。。。
Minor GC : 新生代GC,指发生在新生代的垃圾收集动作,java8中所有的Minor GC都会触发STW,不过这个过程非常短暂,通常在ms的程度。
Major GC/Full GC : 老年代GC,指发生在老年代的垃圾收集,它要比Minor GC慢很多,触发的STW也更长。我们在生产环境中要特别注意Major GC引起的STW。
3.2 java8堆内存结构与GC简介
3.2.1 java8堆内存结构
java8的堆内存分为新生代(young gen,有时翻译为年轻代)和老年代(old gen