垃圾收集器

垃圾收集器
衡量一个垃圾收集器的三项最重要的指标是:

  • 内存占用
  • 吞吐量
  • 延迟

并发的可达性分析:
怎么保障一致性的快照,这里可以考虑到三色标记法作为工具来辅助推导,

  • 白色
    表示对象尚未被垃圾收集器访问过
  • 黑色
    表示对象已经被垃圾收集器访问过,并且这个对象的所有引用都已经扫描过,黑色对象不可能直接(不经过灰色对象)指向白色对象
  • 灰色
    表示对象已经被垃圾收集器访问过,但这个对象上至少存在一个引用还没有被扫描过

这里可以想象一下,把它看作对象图上一股以灰色为波峰的波纹从黑向白推进的过程

有俩种条件同时满足时,会产生对象消失的问题,即原本应该是黑色的对象被误标为白色

  • 并发线程插入了一条或多条从黑色对象到白色对象的新引用
  • 并发线程删除了全部从灰色对象到该白色对象的直接引用或间接引用

解决方法

注:无论是对引用关系记录的插入还是删除,虚拟机的记录操作都是通过写屏障实现的

  • 增量更新(CMS基于这个实现)
    这个破坏的是第一个条件,黑色对象一旦新插入了指向白色对象的引用之后,它就变为灰色对象了,还可以重新扫描
  • 原始快照(G1,Shenandoah基于这个实现)
    这个破坏的是第二个条件,当灰色对象要删除指向白色对象的引用关系时,就将这个要删除的引用记录下来,再将这些记录过的引用关系中的灰色对象为根,重新扫描一次

并行paraller:多条垃圾收集器线程之间的关系,说明同一时间有多条这样的线程在协同工作,通常默认此时的用户线程是处于等待状态
并发concurrent:垃圾收集器与用户线程之间的关系,说明同一时间垃圾收集器线程与用户线程都在运行

1.Serial收集器(回收的区域是年轻代)
最基础,最悠久的收集器,这个收集器时一个单线程工作的收集器,这个就说明在它进行垃圾收集时,必须暂停其他所有工作线程,直到它收集结束
2.ParNew收集器(回收的区域年轻代)
实质上是serial收集器的多线程并行版本,除了同时使用多条线程进行垃圾收集之外,其余的和serial收集器一模一样,这个可以搭配着和CMS收集器一起用
3.Parallel Scavenge收集器(回收的区域年轻代)
基于标记-复制算法实现的收集器,也是能够并行收集的多线程收集器,和ParNew收集器很相似,这个不可以搭配cms收集器使用
特点:达到一个可控制的吞吐量,吞吐量是处理器用于运行用户代码的时间与处理器总消耗时间的比值
吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间)
4.Serial Old收集器(回收的区域是老年代)
这个是serial收集器的老年代版本,也是单线程收集器,使用标记-整理算法实现
5.Parallel Old收集器(回收的区域老年代)
这个是Parallel Scavenge收集器的老年代版本,支持多线程并行收集,基于标记-整理算法实现
6.CMS收集器(回收的区域是老年代)
这个是hotspot虚拟机第一款真正意义上支持并发的垃圾收集器,它是作为老年代的收集器,基于标记-清除算法实现
特点:获取最短回收停顿时间,希望系统的停顿时间尽可能短,以给用户带来更好的交互体验

  • 垃圾回收器的搭配

    • Serial/Serial Old
      请添加图片描述
    • ParNew/Serial Old
      请添加图片描述
    • Parallel Scavenge/Parallel Old
      请添加图片描述
    • CMS(可以和serial和parnew搭配,不可以和parallel scanvge搭配)
      请添加图片描述

7.G1收集器
整体上看是基于标记-整理的算法实现,但是从局部上看,俩个region之间上看又是基于标记-复制的算法实现
开创了收集器面向局部收集的设计思想和基于区域region的内存布局形式,它也是遵循分代收集理论设计的,但是它不再坚持固定大小以及固定数量的分代区域划分,而是把连续的java堆划分为多个大小相等的独立区域,每一个区域都可以根据需要,去扮演新生代的eden空间,sur空间,或者老年代空间
虽然还保留着新生代和老年代的概念,但是新生代和老年代已经不是固定的了,他们都是一系列区域的动态集合,将区域region作为单位回收的最小单位,每次收集到的内存空间都是region大小的整数倍,这样可以有效的避免在整个java堆中进行全区域的垃圾收集

  • G1运行示意图
    请添加图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值