JVM--垃圾收集器

  既然有垃圾收集算法,那么就有实现算法的垃圾收集器。

一、Serial收集器(新生代收集器)

  Serial收集器是一个单线程的收集器,既然是单线程就意味着它只会使用一个CPU或者一条收集线程去完成垃圾收集工作。

  因为是单线程,所以在Serial收集器开始垃圾收集时,必须暂停其他所有的工作线程,直到它收集结束。

  Serial收集器的优点:

    与其他单线程的收集器相比,简单高效。

    对于限定单个CPU的环境,Serial收集器没有线程的交互开销,专心做垃圾收集,可以获得最高单线程的收集效率

    Serial收集器运行在Client模式(桌面应用)下是一个很好的选择。

二、ParNew收集器(新生代收集器)

 

  ParNew收集器是Serial收集器多线程的版本,ParNew是新生代收集器,一般与老年代CMS收集器配合工作。

  并行:多条垃圾收集线程并行工作,但此时用户线程仍然处于等待状态。

  并发:用户线程与垃圾收集线程同时执行(不一定是并行的,可能会交替执行),用户程序在继续运行,而垃圾收集程序运行于另一个CPU上。

三、Parallel Scavenge收集器(新生代收集器)

   Parallel Scavenge收集器是一个新生代收集器,使用复制算法,“吞吐量优先”收集器

  Parallel Scavenge收集器的关注点:达到一个可控制的吞吐量(Throughput)。吞吐量是运行用户代码的时间与CPU总消耗时间的比值。

  吞吐量 = 运行用户代码时间 / (运行用户代码时间 + 垃圾收集时间)。

  Parallel Scavenge收集器有自适应调节策略,虚拟机动态的调节Parallel Scavenge收集器的参数以提供最合适的停顿时间或者最大的吞吐量,这种调节方式称为GC自适应调节策略

  自适应调节策略是Parallel Scavenge收集器与ParNew收集器的一个重要区别。

四、Serial Old收集器

  Serial Old收集器是Serial收集器的老年代版本,Serial Old收集器是单线程的,使用“标记-整理算法”。

五、Serial Old收集器 

  Parallel Old收集器是Parallel Scavenge收集器的老年代版本,使用多线程和“标记--整理”算法,优点:并发收集、低停顿

  常与Parallel Scavenge收集器组合使用。

六、GMS收集器

 

  CMS收集器的关注点:尽可能的缩短垃圾收集时用户线程的停顿时间,是一种以获取最短回收停顿时间为目标的收集器。 

  CMS(Concurrent Mark Sweep)收集器基于“标记-清除”算法。垃圾收集过程可分为4步骤:

1、初始标记(Stop the World)

  标记一下GC Root能直接关联到的对象,速度较快。

2、并发标记

  进行GC Roots Tracing的过程。

3、重新标记(Stop the World)

  修正并发标记期间因为用户程序继续运行而导致标记产生变动的那一部分对象的标记记录。

4、并发清除

  耗时最长的并发标记与并发清除过程收集器线程可以与用户线程一起工作,过程与所以从总体上看,CMS收集器的内存回收过程是与用户线程一起并发执行的。

CMS收集器的缺点:

1、对CPU资源敏感

  CMS默认启动回收的线程数是  (CPU数量 + 3)/ 4 ,当CPU在4个以上时,并发回收时垃圾收集线程不少于25%的CPU资源,随着CPU数量的增加而下降。

2、无法处理浮动垃圾

  出现在标记过程之后的垃圾,只能等待下一次GC时再清理掉。

3、标记-清除算法实现的,会产生大量的空间碎片,可能会提前触发Full GC

七、G1收集器

  G1收集器面向服务端应用的垃圾收集器。

1、G1收集器的特点

1、并行与并发

  使用多个CPU来缩短Stop-The-World停顿的时间。

2、分代收集

3、空间整合

  G1从整体来看是基于“标记-整理”算法实现的收集器,从局部上来看是基于“复制”算法实现的。这两种算法都不会产生空间碎片,收集后可提供规整的可用内存。

4、可预测的停顿

  可建立可预测的时间模型,指定在一个长度为M毫秒的时间内,消耗在垃圾收集的时间不得超过N毫秒。

  使用独立区域(Region)划分内存空间以及有优先级的区域回收方式,保证了G1收集器在有限的时间内可以获取尽可能高的收集效率。

  在G1收集器中,Region之间的对象引用以及其他收集器中的新生代与老年代之间的对象引用,虚拟机是使用Remembered Set来避免全栈扫描的。当进行内存回收时,在GC根节点的枚举范围中加入Remembered Set即可保证不对全栈扫描也不会有遗漏。

2、G1收集器工作步骤

1、初始标记(Stop the world)

  标记GC Roots能直接关联到的对象,并让下一阶段用户程序并发运行时,在正确可用的Region中创建新对象,该阶段需要停顿线程。

2、并发标记

  从GC Root开始对堆中对象进行可达性分析,找出存活对象,与用户线程并发执行。

3、最终标记(Stop The World)

  修正在并发标记期间因用户程序继续运作而导致标记产生变动的那一部分标记记录。

4、筛选回收

  对各个Region的回收价值和成本进行排序,根据用户期望的GC停顿时间来制定回收计划。

八、搭配使用

  连线的表示可以搭配使用。

   

 

posted @   无虑的小猪  阅读(77)  评论(0编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示

目录在这里