Java-JVM-垃圾回收器

垃圾回收器都有那些?

单线程垃圾回收器: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 会造成长时间的程序停顿

上一篇:iNeuOS工业互联网平台,机床云行业应用案例


下一篇:Java中的Enum枚举类型总结