您的位置:首页 > 其它

JVM-新老年代垃圾回收器

2020-08-21 18:18 78 查看

垃圾回收器图表

Serial新生代 & Serial OId 老年代 的垃圾收集器组合

  • Serial是针对新生代的垃圾收集器,采用复制算法
  • Serial OId是老年代的垃圾收集器,采用标记-整理算法
  • Serial这套垃圾收集器组合特点是单线程垃圾回收器

STW: Java中Stop-The-World机制简称STW,是在执行垃圾收集算法时,Java应用程序的其他所有线程都被挂起(除了垃圾收集帮助器之外)。Java中一种全局暂停现象,全局停顿,所有Java代码停止,native代码可以执行,但不能与JVM交互;这些现象多半是由于gc引起。

工作流程:

  • Serial新生代:用户的执行过程是多线程的,执行到某一个时机段时(GC线程),走到GC线程时它要执行STW停止所有的用户线程执行标记复制算法(因为如果不停止所有的用户的线程时永远都处理不完)
  • Serial OId 老年代:当老年代的内存不够的时候它也会执行STW停止所有用户线程执行标记整理算法。

Serial新生代 & Serial OId 老年代 的垃圾收集器组合他们是1.3之前的王牌选择
特点:这个组合是非常简单高效的算法,也是一个单线程串行的。
缺点:收集过程需要STOP THE WORD, 无法使用到多核的CPU资源,采用单线程收集

Par New

  • Par New 垃圾收集器是新生代的多线程并发的垃圾收集器
  • Par New 可理解为Serial收集器的多线程版本,在其他方面几乎跟Serallt特性是一致的,并没有什么创新
  • Par New是CMS首选。

工作流程:

  • 当我们的用户在执行多线程的时候,达到了一定的时刻(GC线程),就会启动多个Par New线程一起执行标记复制算法处理Yound区STW操作。
  • Par New是目前JVM运行在Server模式下的配合CMS首选的新生代垃圾收集器。
  • 因为在JDK1.5版本出现了一个针对OId区跨时代意义的收集器CMS(Concurent Mark Sewwp)
  • 除了单线程的Serial收集器外,目前只有Par New新生代收集器能与CMS收集器兼容配合工作,所以没有办法,你要选择CMS作为老年代收集器的话,只能选择Serial或者Par New收集器与之匹配,所以Par New在多CPU的Server场景首选。

Parallel Scavenge & Parallel OId 垃圾回收器组合

  • Parallel Scavenge收集器是一个新生代收集器,它也是使用复制算法的收集器,同时也是并行的多线程收集器,工作机制与我们的ParNew是一致的,但是Parallel Scavenge更关注系统的吞吐量

  • 系统的吞吐量 = 用户工作时间 / 用户工作时间 + GC时间

  • Parallel OId 是Parallel Scavenge的老年代垃圾收集器,采用的标记整理算法,在JDK1.6才开始正式启用的OId区并行垃圾收集器,所以Parallel Scavenge在Parallel OId出来之前很尴尬,因为Parallel Scavenge+Serial OId的组合很鸡肋,新生代用并行类的收集器,但是OId区又跟不上脚步。

  • Parallel Scavenge & Parallel OId 垃圾回收器组合 和 Serial新生代 & Serial OId 老年代 的垃圾收集器组合就在于多核CPU处理问题,他们采用是多线程执行。这就是随着硬件发展来的全新的组合。

CMS垃圾回收器【重点】concurrent mark sweep

  • CMS垃圾收集器是OId区的垃圾收集器
  • 是第一个实现并发收集器线程
  • 设计的目标以最短停顿时间为设计原则。CMS采用标记-清除算法

CMS的四个收集步骤

  1. 初始标记-(需要STW 极短的时间停止)
  • 仅仅标记GC ROOTS直接指向对象的第一个字节点
  • STW的时间会很短,因为仅仅标记GC ROOTS直接关联对象,不用进行跟踪,速度非常快。
  1. 并发标记-(GC标记线程与用户线程一起工作)
  • 扫描所有的OId区,如果扫描的对象能够找到GC ROOT就不需要清理,如果找不到GC ROOT就需要被清理,基于GCROOTS TRACING和标记的过程,但是并发标记过程中,有可能用户会产生新的垃圾或者用户程序运行产品的变动的情况。
  1. 重新标记-(需要STW) 修正的工作
  • 重新标记-修正并发标记期间,产生的新的垃圾或者变动的情况,STW的时间也会很短,因为前面的并发标记阶段已经标记了基于GC ROOTS所有对象,修正只需要修正少量的对象
  1. 并发清理-(GC清理线程与用户线程一起工作)
  • 与用户一起工作进行,清理工作,采用标记-清除算法,这种算法只需要清理垃圾的对象就行了,不需要做内存的整理。

优点:充分利用CPU资源并发收集,低停顿
缺点:

  1. 标记-清除算法将产生空间碎片问题, ---->promotion
    failure concurrent mode failed -----> 强制退化成Serial OId标记整理
  2. 并发标记和并发清理阶段由于并不是全力进行GC工作一定会带来GC时间过长,影响吞吐量。
  3. 清理不彻底,会产生浮动垃圾,且浮动垃圾只能在下一次垃圾回收才能处理。

越努力老婆就越年轻,加油。
JVM-java文件到运行在JVM过程
JVM-Stacks 虚拟机栈
程序计数器
堆和本地方法栈
方法区演化过程
JVM-三大垃圾回收算法
java-四种引用类型【强-软-弱-虚】

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: