垃圾收集器是Java的招牌,已经在不断的演进中进行了长期的改进
垃圾收集器首先说,是由不同厂商提供的不同的选择
常见的
Serial GC 单线程的GC,收集的时候进入Stop-The-World 单线程意味着精简GC的实现
有着老年代的 Serial Old 标记整理法的实现
使用如下
-XX: +UseSerialGC
ParNew GC
新生代GC的实现,是Seral GC的多线程版本,常见于配合老年代的CMS GC工作
-XX: +UserConcMarkSweepGC -XX: +UseParNewGC
CMS GC 标记清除,目的是减少停顿,但是有碎片问题,占用更多CPU资源,和用户线程争抢
Parallel GC,默认的选择,吞吐量有限,老年代和新生代GC是并行的
-XX: +UseParallelGC
还有着设置暂停时间和吞吐量的工鞥
-XX: MaxGCPauseMillis=value
-XX: GCTimeRatio=N
GC时间比例 1/N+1
G1 GC,兼顾了吞吐量和停顿时间,JDK9之后的默认GC,可以直接设定停顿时间
存在着年代的概念,内部是一个个的Region,类似一个棋盘,棋格之间利用的标记-整理
G1的能力非常不错,而且CMS在JDK9中被标记为了废弃,G1 GC值得掌握
常见的算法有
复制算法,就是将每次GC后活着的对象复制到一个新的区域
标记清理,就是进行先标记,然后进行清理,但是有着碎片化的问题
标记整理,类似标记 清除,但是避免内存碎片化,会在清理的过程中移动对象,保证留有连续空间
然后就是GC的发展历程
在默认的G1 GC不断的改进中,我们认为的一些缺点已经不再存在了
G1的Full GC表现可能优于Parallel GC的并行GC
而且对于Serial GC,虽然古老,但是开销很小,适合于当下的Severless场景
但是CMS GC伴随着时代的发展,已经被废弃了
在GC的发展中,还出现了一些特殊的GC方式
Epsilson GC,不进行垃圾收集的GC,专注于性能测试
ZGC,Oracle 开源出来的一个超级GC的实现,惊讶的扩展能力,支持T bytes级别的堆大小,延迟不超过10ms,现只支持Linux 64位平台