6、Hotspot中的垃圾收集器

1、Serial/Serial Old收集器java

  1. 历史最悠久的收集器
  2. 单线程的收集器
  3. 在工做时须要停掉虚拟机全部线程
  4. 优势是在作事专注,动做迅速
  5. 在Client端的新生代中通常使用这个收集器回收,回收200M之内的新生代只须要不到100ms,这对于Client是能够接受的

2、ParNew收集器算法

  1. Serial收集器的多线程版本
  2. 只有ParNew收集器能够与CMS收集器配合使用

3、Parallel Scavenge收集器多线程

  1. 吞吐连优先的收集器 
  2. 吞吐量:代码运行时间/(代码运行时间 + 垃圾收集时间)

4、CMS收集器并发

  1. 老年代并发收集器
  2. 基于 标记清除算法实现
  3. 执行垃圾收集时有四个步骤
    • 初始标记(Stop the World):标记一下GC Root能直接关联的对象,速度很快
    • 并发标记:使用可达性分析算法,标记须要回收的对象
    • 从新标记(Stop the World):标记 并发标记 期间变化的对象(多线程)
    • 并发清除
  4. CMS优势:并发收集、低停顿
  5. CMS缺点:
    • 并发占用CPU,致使用户线程变慢
    • 会产生浮动垃圾(并发清除时产生的垃圾),由于在并发清除时还用用户线程在执行,因此要预留一部份内存,因此能够经过参数设定当老年代内存被占用 X% 时触发CMS回收,若是回收失败,会触发Serial Old收集器,进行再一次回收
    • CMS收集器是使用标记清除算法实现的,因此会残生大量内存碎片,因此当CMS收集器触发Serial Old时要进行内存整理操做(这个过程没法并发,因此会致使程序变慢,能够经过参数设定)

 

5、G1收集器线程

  1. G1收集器是注重停顿时间的收集器
  2. G1收集器能够不须要其余收集器配合,独立管理新生代和老年代
  3. G1收集器将java堆分红多个Region(新生代和老年代穿插在不一样的Region里,再也不物理隔离),两个Region经过复制算法手机,总体看来经过标记整理算法手机,不会产生内存碎片
  4. 经过创建可预测的停顿时间模型,可让使用者明确在M毫秒内的内存回收不超过N毫秒
  5. G1收集器,会根据停顿时间模型计算每一个Region回收的经验值,根据能够回收的时间(N毫秒)来回收最有回收价值的Region
  6. G1收集器经过Remebered Set记录Region中对象有没有被其余Region中的对象引用(为了不全堆扫描)
  7. G1收集器的过程:
    • 初始标记(Stop the World):标记一下GC Root能直接关联的对象,速度很快,与CMS不一样的是,这个阶段会修改TAMS值,让 并发标记 阶段产生的新对象都在正确可用的Region中建立
    • 并发标记:经过可达性分析算法标记回收的对象
    • 最终标记:修正在并发标记时改变的对象,并记录到Remebered Set Logs中,而后虚拟机将Logs合并到Remebered Set中,这个过程是并行的(非并发)
    • 筛选回收:根据Region的回收价值大小回收

 

相关文章
相关标签/搜索