七款经典垃圾回收器

Serial

Serial 是一款单线程的垃圾回收器,在进行垃圾回收的时候会发生Stop the world 。
对于其余垃圾收集器而言,他的内存占用是最小的。
image算法

ParNew

ParNew 其实是Serial 收集器的并行版本
image并发

Parallel Scavenge

注重吞吐量的垃圾收集器。
吞吐量= 运行用户代码的时间/(垃圾回收的时间+运行用户代码的时间)
他有两个参数用于精确控制吞吐量大小:
-XX:MaxGCPauseMills:控制垃圾回收的时间
这个值并非越小越好,咱们知道,内存越小,进行垃圾回收的时间就越短。若是咱们将这个值设置地较小,那么回收的内存部分也就小。这也就致使gc 进行垃圾回收的频率也越高,这样吞吐量也就降低了。
-XX:GCTimeRatio:垃圾回收时间的比例
这个值默认是99 .也就是说 垃圾回收的时间只占1%(1/1+99)布局

Serial Old

是serial收集器的老年代版本
有两个用途spa

  • 在jdk5及以前的版本中与Parallel Scavenge 收集器搭配使用
  • 在cms收集器发生失败的后备预案

Parallel Old

是Parallel Scavenge 的老年代版本线程

CMS(Current Mark and Sweep)

真正意义上的并发收集器,第一次实现了让垃圾收集线程与用户线程(基本上)同时工做
整个过程能够分为四部分:对象

  • 初始标记
    扫描和GCRoots直接关联的对象,速度很快
  • 并发标记
    遍历整个对象图,时间较长
  • 从新标记
    标记产生变更的那一部分对象的标记记录
  • 并发清楚
    清标记阶段断定死亡的对象

缺点:
资源敏感:
CMS的默认启动的垃圾回收线程是(处理器核心数+3)/4,那么在核心数>4 的时候,回收线程只占用不超过25%的处理器运算资源,而且会随着核心数的增长而降低。当核心数<4,CMS对用户线程的影响就变得很大。
并发问题:
用户线程和gc线程同时进行时,会产生一些"浮动垃圾",可是CMS没法处理"浮动垃圾",有可能出现 Concurrent Mode Failure 失败,进而致使另外一次彻底的STW 的full GC 出现。
CMS没法在此次垃圾收集中进行回收,只能等待下一次垃圾回收的时候回收。blog

内存布局问题:
由于CMS是标记并清除算法实现的,也就是说,在进行垃圾回收后的内存布局是零散的,不是连续的。所以,可能存在为大对象分配空间时候出现内存不足的状况,从而致使JVM发生full GC ,产生STW,这是难以让人接受的。
解决方法:内存

  • 一种是在进行必定次数后,进行一次内存整理。(-XX:CMSFullGCsBeforeCompaction)
  • 另外一种是在须要发生full GC 以前进行一次内存整理。(-XX:+UseCMSCompactionAtFullCollection)

Garbage First

停顿时间模型--在一个长度为M毫秒的时间内,进行垃圾回收的时间大几率不超过N毫秒。
面向局部收集的思路和基于region的内存布局形式
image
G1把内存划分为多个大小相等的独立和空间,每个region根据须要扮演不一样的角色。当须要分配大对象的时候,会将连续的Region分区划给这个大对象(Humougous)。
回收策略:
G1收集器去跟踪各个region中的垃圾的价值(回收所得到的空间大小以及回收须要时间的经验值),而后在后台维护一个优先级列表,每次根据设定的停顿时间来优先回收知足条件的region。
回收过程:资源

  • 初始标记
  • 并发标记
  • 最终标记
  • 筛选回收
相关文章
相关标签/搜索