1、常用参数详解
通过阅读GC日志,我们可以了解Java虚拟机内存分配与回收策略。
内存分配与垃圾回收的参数列表
- -XX:+PrintGC :输出GC日志。类似:-verbose:gc
- -XX:+PrintGCDetails :输出GC的详细日志
- -XX:+PrintGCTimestamps :输出GC的时间戳(以基准时间的形式)
- -XX:+PrintGCDatestamps :输出GC的时间戳(以日期的形式,如2013-05-04T21: 53: 59.234 +0800)
- -XX:+PrintHeapAtGC :在进行GC的前后打印出堆的信息
- -Xloggc:…/logs/gc.log :日志文件的输出路径
2、GC 日志补充说明
-
“[GC"和”[Full GC"说明了这次垃圾收集的停顿类型,如果有"Full"则说明GC发生了"Stop The World"
-
使用Serial收集器在新生代的名字是Default New Generation,因此显示的是"[DefNew"
-
使用ParNew收集器在新生代的名字会变成"[ParNew",意思是"Parallel New Generation"
-
使用Parallel scavenge收集器在新生代的名字是”[PSYoungGen"
-
老年代的收集和新生代道理一样,名字也是收集器决定的
-
使用G1收集器的话,会显示为"garbage-first heap"
-
Allocation Failure表明本次引起GC的原因是因为在年轻代中没有足够的空间能够存储新的数据了。
-
[ PSYoungGen: 5986K->696K(8704K) ] 5986K->704K (9216K)
中括号内:GC回收前年轻代大小,回收后大小,(年轻代总大小)
括号外:GC回收前年轻代和老年代大小,回收后大小,(年轻代和老年代总大小) -
user代表用户态回收耗时,sys内核态回收耗时,real实际耗时。由于多核线程切换的原因,时间总和可能会超过real时间
3、常用日志分析工具
常用的日志分析工具有:GCViewer、GCEasy、GCHisto、GCLogViewer、Hpjmeter、garbagecat等。
推荐:GCeasy
4、垃圾回收器的发展
-
SerialGC的开销(本身、GC相关数据结构、线程)非常小,随着云计算的兴起,在serverless等新的应用场景下,Serial GC找到了新的舞台。
-
CMS在 JDK9中 已经被标记为废弃,并在JDK14版本中移除。
-
Shenandoah(Open JDK12支持),由 RedHat 实现
- Shenandoah GC的弱项:高运行负担下的吞吐量下降。
- Shenandoah GC的强项:低延迟时间。
-
ZGC
- ZGC收集器是一款基于Region内存布局的,(暂时)不设分代的,使用了读屏障、染色指针和内存多重映射等技术来实现可并发的标记-压缩算法的,以低延迟为首要目标的一款垃圾收集器。
- ZGC的工作过程可以分为4个阶段:并发标记 - 并发预备重分配 - 并发重分配 - 并发重映射 等。
- ZGC几乎在所有地方并发执行,除了初始标记是STW的。所以停顿时间几乎就耗费在初始标记上,这部分的实际时间是非常少的。
-
AliGC是阿里巴巴JVM团队基于G1算法,面向大堆(LargeHeap)应用场景。