垃圾回收器都有那些?
单线程垃圾回收器:Serial、Serial Old
多线程垃圾回收器:ParNew、Parallel、Parallel Old
并发垃圾回收器:CMS,G1
你最了解那一款垃圾回收器
都知道一点吧,比如说单线程的Serial、SerialOld,适合用在一些单核的CPU中,比如说一些嵌入式
然后ParNew的话是一个独立的年轻代的垃圾回收器,是第一款多线程的垃圾回收器,是Serial的多线程的的版本
随后就是 Parallel 是JDK8中的默认的垃圾的回收器,以吞吐量优先的的垃圾回收器
再然后就是CMS,这是在JDK 1.5的时候推出的划时代的并发回收器,第一次实现了垃圾收集线程和用户线程同时的工作。关注点在于如何更好的停顿时间,在一些服务器端会带来更好的体验
随后就是在JDK1.7的u4版本中可用的G1垃圾回收器,以良好的吞吐量为优先,目标是在低延迟的情况下得到更好的吞吐量,担任的全功能的垃圾回收期
你了解CMS的垃圾回收算法吗?
CMS是一个并发的垃圾回收器,所以说,大概有以下这几个过程
- 初始化标记阶段,标记处GC Roots
- 并发标记阶段,这个阶段会根据GC Roots进行向下标记,但是并不会造成STW
- 重新标记阶段,这个阶段可能会造成一些垃圾回收的浮动垃圾,于是就会进行重新的标记
- 垃圾清除阶段:这个是一个并发的清除的过程,所以说采用的是标记清除算法,如果使用压缩,以防止干扰用户线程
那G1的垃圾回收算法呢
G1垃圾回收是基于Region分区的,它把整个堆在逻辑上拆分成了老年代、年轻代,随后避免全堆的收集,有一个可以遇见的时间模型,根据一个优先的列表在运行收集的时间内。优先回收价值比较大的Region,所以说也就叫垃圾优先,G first。
他的垃圾回收主要分为
- 年轻代gC
- 老年代的并发标记
- 混合回收
- 还有独占的、单线程的Full GC
年轻代的GC主要有
- 扫描根
- 更新Result集合
- 处理RSet集合
- 复制对象
- 处理引用
并发标记的过程有
- 初始化标记阶段:这个阶段会触发一次年轻代的GC
- 根区域扫描
- 并发标记
- 再次标记
- 独占清理
- 并发清理
Full GC
如果上述的垃圾算法都无法满足,那么就会触发Full GC,Full GC 会造成长时间的程序停顿