低延迟的垃圾回收器
传统的垃圾回收器一般情况下 内存占用、吞吐量、延时 只能同时满足两个。但是现在的发展,延迟这项的目标越来越重要。所以就有低延迟的垃圾回 收器。
Eplison
JAVA11新的垃圾回收器,是一个“不干活”的垃圾回收器,负责堆的管理与布局、对象的分配、与解释器的协作、与编译器的协作、与监控子系统协作等职责,主要用于需要剥离垃圾收集器影响的性能测试和压力测试。
ZGC
有类似于 G1 的 Region,但是没有分代。标志性的设计是染色指针 ColoredPointers(这个概念了解即可),染色指针有 4TB 的内存限制,但是效率极高,它是一种将少量额外的信息存储在指针上的技术。它可以做到几乎整个收集过程全程可并发,短暂的 STW 也只与 GC Roots 大小相关而与堆空间内存大小无关,因此考科一实现任何堆空间 STW 的时间小于 十毫秒的目标。
Shenandoah
第一款非 Oracle 公司开发的垃圾回收器,有类似于 G1 的 Region,但是没有分代。也用到了染色指针 ColoredPointers。效率没有 ZGC 高,大概几十毫秒的目标。
GC 日志详解
输入打印日志参数:-XX:+PrintGCDetails
[GC (Allocation Failure) [PSYoungGen: 36840K->5112K(68608K)] 61272K->62456K(153600K), 0.0147071 secs] [Times: user=0.03 sys=0.02, real=0.01 secs]
[Full GC (Ergonomics) [PSYoungGen: 5112K->0K(68608K)] [ParOldGen: 57344K->59139K(143360K)] 62456K->59139K(211968K), [Metaspace: 3474K->3474K(1056768K)], 0.0343160 secs] [Times: user=0.11 sys=0.00, real=0.04 secs]
从左至右顺序:
GC:说明了这次垃圾收集的类型,GC
表示发生了新生代GC(Minor GC),Full GC
一般情况下表示同时发生了新生代GC(Minor GC)和老年代GC(Major GC)。
Allocation Failure:Allocation Failure
和Ergonomics
表示触发GC的原因。
PSYoungGen:PSYoungGen
、ParOldGen
、Metaspace
表示GC发生的区域,这里显示的区域名称与使用的垃圾收集器有关。
36840K:GC前该内存区域已使用容量。
5112K:GC后该内存区域已使用容量。
68608K:GC前该内存区域已使用容量总大小。
61272K:GC前堆已使用容量。
62456K:GC后堆已使用容量。
153600K:堆总容量。
0.0147071 secs:表示该区域GC所占用的时间,单位是秒。
user=0.03:用户态消耗CPU的时间(GC线程消耗CPU的总时间)。
sys=0.02:内核态消耗CPU的时间(GC过程中操作系统调用和系统等待事件所消耗的总时间)。
real=0.01 secs:操作从开始到结束所经过的墙钟时间(应用程序暂停的时间),CPU时间与墙钟时间的区别是,墙钟时间包括各种非运算的等待耗时,例如等待磁盘I/O、等待线程阻塞,而CPU时间不包括这些耗时,但当系统有多个CPU或者多核的话,多线程操作会叠加这些CPU时间,所以有时会看到user或sys时间超过real时间。通常情况下real ≈ (user + sys) / GC线程数
。
声明:本文为学习享学课堂三期JVM章节课后所做的学习总结,文中借鉴King老师上课笔记和课堂PPT。