携手创作,共同成长!这是我参与「掘金日新计划 · 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垃圾收集器则是采用另外的一种思想,新生代与老年代位置混编,将堆分为一个个的格子。由于可以选择按区域回收,因此降低停顿时间,达到停顿时间可控。
后记
- 千古兴亡多少事?悠悠。不尽长江滚滚流。