垃圾收集器是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位平台

发表评论

邮箱地址不会被公开。 必填项已用*标注