JVM-垃圾收集器-《深入理解Java虚拟机》学习笔记

垃圾收集器

新生代的收集器

  • 串行收集器(Serial收集器)

    • 单一线程工作
    • Stop the world
    • 客户端模式默认收集器
    • 简单高效,新生代复制算法,老年代标记-整理算法
    • 在这里插入图片描述
  • ParNew收集器

    • 年轻代,多线程并行GC
    • 对CPU的依赖性比较高
    • 复制算法
    • 在这里插入图片描述
  • Parallel Scavenge收集器

    • 关注的侧重点在吞吐量
    • 自适应的调节策略

老年代的收集器

  • Serial Old收集器

    • 标记 整理
    • CMS收集器发生失败时的后备预案,在并发收集发生Concurren Mode Failure时使用
      在这里插入图片描述
  • Parallel Old 收集器

    • 标记整理算法
    • 注重吞吐量或者处理器资源比较稀缺的场合
    • 在这里插入图片描述
  • CMS收集器

    • 采用标记-清除
    • 最短回收停顿时间
    • 并发收集,低停顿
    • 对处理器资源要求比较高
    • 无法处理 浮动垃圾
    • 在这里插入图片描述

要有初始标记,并发标记,重新标记和并发清除四个阶段,就是说首先先标记GC root,然后向下搜索和GC root关联的对象,然后修改在并发标记期间因为标记状态改变的,最后将需要回收的回收掉。

缺点就是对CPU太敏感,会产生浮动垃圾,而且会产生大量内存碎片。

  • G1收集器
    • 面向服务端应用
    • 可预测停顿时间垃圾收集器
    • 基于Region的堆内存布局
    • 可以管理全堆内存
    • 按收益动态确定回收集
    • 也是分代理论,但内存中不在划分新生代、老年代
    • 四个步骤
      • 出初始标记
      • 并发标记
      • 最终标记
      • 筛选删除
    • 在这里插入图片描述

采用标记-整理

主要有初始标记,并发标记,最终标记和筛选删除四部分,G1收集器主要的特点就是它虽然理论上还有新生代和老年代概念,但是却将内存分为若干个大小相等的region,会有一个优先回收列表,回收掉回收收益最大的那个region。G1收集器是一款在server端运行的垃圾收集器,专门针对于拥有多核处理器和大内存的机器,在JDK 7u4版本发行时被正式推出,在JDK9中更被指定为官方GC收集器。它满足高吞吐量的同时满足GC停顿的时间尽可能短。

G1与CMS优缺点对比

  • 内存占用

虽然G1和CMS都使用卡表来处理跨代指针,但G1的卡表实现更为复杂,而且堆中每个Region,无论扮演的是新生代还是老年代角色,都必须有一份卡表,这导致G1的记忆集(和其他内存消耗)可能会占整个堆容量的20%乃至更多的内存空间;相比起来CMS的卡表就相当简单,只有唯一一份,而且只需要处理老年代到新生代的引用,反过来则不需要,由于新生代的对象具有朝生夕灭的不稳定性,引用变化频繁,能省下这个区域的维护开销是很划算的。

  • 执行负载

譬如它们都使用到写屏障,CMS用写后屏障来更新维护卡表;而G1除了使用写后屏障来进行同样的(由于G1的卡表结构复杂,其实是更烦琐的)卡表维护操作外,为了实现原始快照搜索(SATB)算法,还需要使用写前屏障来跟踪并发时的指针变化情况。

CMS的写屏障实现是直接的同步操作,而G1就不得不将其实现为类似于消息队列的结构,把写前屏障和写后屏障中要做的事情都放到队列里,然后再异步处理。

  • Shenandoah
  • ZGC
    • 染色指针技术
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值