目录
java8垃圾收集器组合一览
我们知道,针对年轻代和年老代的垃圾回收需要采取不同的gc算法(因为年轻代的内存经常被回收,而年老代的内存很少被回收,根据这个特性所采取的的算法往往是不一样的)。
在java8中,针对年轻代和年老代的垃圾回收,java8采用垃圾收集器组成下列组合;
现在常用的垃圾收集器组合有4种(上图黑色字体加粗的):
- 年轻代和年老代使用串行gc(gc就是垃圾收集器garbage collection)
- 年轻代和年老代使用并行gc
- 年轻代使用并行gc,年老代使用并发标记清除垃圾收集器
- 年轻代和老年代使用G1垃圾收集器
serial GC(串行GC)的实现
串行gc对年轻代使用标记-复制算法(mark-copy),对年老代使用标记-清除-整理算法(mark-sweep-compact)。不管是年轻代还是年老代,在触发gc时都会导致全线暂停(STW)。所以串行gc的缺点是不能充分利用多核CPU,JVM在进行垃圾收集时都只能使用单核(不然为啥叫串行呢[doge])。
JVM让年轻代和年老代使用串行GC的指令如下:
java -XX:+UseSerialGC 你要执行的class文件
这个指令执行后项目的JVM就会采取串行GC的方式进行垃圾回收,我们需要打开GC日志进行分析所以启动指令改为:
java ‐XX:+PrintGCDetails ‐XX:+PrintGCDateStamps ‐XX:+PrintGCTimeStamps -XX:+UseSerialGC 你要执行的class文件
串行gc日志分析
接下来根据网上的gc日志图片学习一波gc日志分析
Minor GC(小型GC)
上面这个截图就是清理年轻代的gc事件,下面分析一波日志:
- 2015‐05‐26T14:45:37.987‐0200:GC事件的开始时间,-0200表示西二时区,中国所在的东8区是+0800.
- 151.126:GC事件开始时,相对于JVM启动时的间隔时间,单位秒。
- allocation Failure:触发GC的原因。即本次GC是由于年轻代中没有空间来存放新的数据接口引起的。
- DefNew:垃圾收集器在