2022年8月更文挑战7-java垃圾回收器

72 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第7天,点击查看活动详情

java垃圾回收器

前文

本文内容为对于垃圾回收算法的进一步总结,主要是针对垃圾回收器,主要是java8之前hotspot所采用的垃圾回收器。java8之后的zgc、epsilon gc等等先不进行讨论。

几种垃圾回收器

新生代垃圾回收器与老年代垃圾回收器为对应的关系,如下为几种垃圾回收器的对应关系:

  • 新生代:serial gc;老年代:serial old gc==串行垃圾回收。
  • 新生代:parallel scavenge gc;老年代: parallel old gc==并行垃圾回收。
  • 新生代:parNew gc;老年代:cms gc==并行垃圾回收,老年代采用cms回收器。
  • 新生代及老年代:g1 gc==以逻辑分代替换物理分代

串行垃圾回收器

串行垃圾回收器也就是最基础的垃圾回收器,按照串行的方式进行垃圾回收。在垃圾回收时,整个程序会处于停止阶段,一般被称作stw,stop the world。很明显,回收时整个程序由于垃圾回收是串行的,因此会导致程序终止时间比较长,影响业务的进行。而控制程序停止时间,也是各个垃圾回收器主要的优化方向。

并行垃圾回收器

上面提到了串行垃圾回收,自然第一反应也就是并行垃圾回收器。它是在串行垃圾回收基础上进行的优化,由于是串行的方式修改为并行,时间会显著缩短,但依然会出现全局停止的问题。

cms垃圾回收器

下面来看cms垃圾回收器,这是另一种垃圾回收,可以认为是在并行垃圾回收基础上的优化,是一种老年代的垃圾回收器。它的垃圾回收分为以下几个阶段:初始标记、并发标记、重新标记、并发清除。初始标记阶段主要是标记gc root,该操作会导致短暂的stw。并发标记是在执行的过程中同时进行标记,不会产生stw。重新标记用于处理并发标记过程中产生的新垃圾,会出现stw。最后阶段进行并发清理。而cms本身可能含有三色标记问题,有兴趣可以查阅资料。

g1垃圾回收器

g1垃圾收集器则是采用另外的一种思想,新生代与老年代位置混编,将堆分为一个个的格子。由于可以选择按区域回收,因此降低停顿时间,达到停顿时间可控。

后记

  • 千古兴亡多少事?悠悠。不尽长江滚滚流。