HotSpot虚拟机的垃圾收集器

本文详细解析了Java中各种垃圾收集器的工作原理,包括Serial、ParNew、ParallelScavenge、SerialOld、ParallelOld、CMS、G1和GarbageFirst收集器的特点与操作过程,帮助读者掌握如何优化应用程序的性能。

两个名词解释

  1. 并行:多条垃圾收集器线程间的关系 通常默认此时用户线程处于等待状态 多条线程一起执行
  2. 并发: 指垃圾收集器线程与用户线程的关系 多条线程交替执行

在这里插入图片描述连线表示可以搭配使用 上为新生代收集器 下为老年代收集器

Serial收集器

新生代收集器 最早出现 现在仍是Hotspot默认新生代收集器 单线程工作 在进行垃圾收集时必须暂停其他所有线程
简单而高效

ParNew收集器

新生代收集器 是Serial收集器的多线程并行版本 其他与Serial基本相同 只有它能与CMS收集器配合使用

ParallelScavenge收集器

新生代收集器 基于标记-复制算法实现 能并行收集 与ParNew非常相似
特点:达到一个可控制的吞吐量(处理器用于运行用户代码的时间与处理器总消耗时间的比值) 即:
吞吐量 = 运行用户代码时间 / 用户运行代码时间+运行垃圾收集时间
该收集器也被称作“吞吐量优先收集器”
有自适应的调节策略:动态调整参数以提供最适合的停顿时间或最大吞吐量

Serial Old收集器

是Serial收集器的老年代版本 单线程收集器 使用标记-整理算法
主要用在客户端模式的Hotspot虚拟机使用 如果在服务端模式使用可以作为CMS收集器发生失败时的后备预案

Parallel Old收集器

是Parallel Scavenge收集器的老年代版本 两者相互搭配 支持多线程并发收集 基于标记-整理算法

CMS收集器

Concurrent Mark Sweep 并发收集低停顿
以获取最短回收停顿时间为目标的收集器 集中应用在互联网网站或者基于浏览器的B/S系统的服务端上 关注服务的响应速度 基于标记-清除算法实现
运作过程:

  1. 初始标记
  2. 并发标记
  3. 重新标记
  4. 并发清除

其中初始标记和重新标记仍然需要停止其他线程
初始标记仅标记GC Roots能直接关联到的对象
并发标记就是从GC Roots的直接关联对象开始遍历整个对象图的过程 耗时长但是不需要停顿用户线程
重新标记 修正并发标记期间因用户线程运作而产生变动的对象的标记记录
并发清除 删除掉已经判定死亡的对象 不需要移动所以可以与用户线程并发
并发标记与并发清除耗时最长
缺点:并发阶段会降低吞吐量 导致程序变慢
并发清除时仍会产生新的垃圾对象(浮动垃圾) 只能留在下一次垃圾收集时清除 同时并发时需要留一部分空间让程序运行
由于采用标记-清除算法 会产生空间碎片

Garbage First收集器

简称G1 开创了收集器面向局部收集的设计思路和基于Region的内存布局形式 被Oracle官方称为“全功能的垃圾收集器”
G1是面向服务端应用的垃圾收集器 取代了Parallel Old加Parallel Scavenge组合 成为服务端模式下默认的垃圾收集器 CMS被沦落为不推荐使用的收集器
G1收集器可以面向堆内存任何部分来组成回收集进行回收 衡量标准不再是属于哪个分代 而是哪块内存中存放的垃圾数量多 回收收益最大 称为Mixed GC模式
G1的开创基于Region的堆布局分布 将连续的java堆划分为多个大小相等的独立区域(Region) 每个区域都能根据需求扮演新生代的Eden空间 Surviror空间 或者老年代空间 然后根据不同的区域采取不同的策略去处理
Region中还有一类特殊的Humongous区域 专门存储大对象(大小超过Region容量的一半
运作过程:

  1. 初始标记 仅标记GC Roots能直接关联的对象 并修改TAMS指针的值 让下一阶段用户线程并发运行时能正确的在Region中分配对象 需要停顿线程但是时间短
  2. 并发标记 从GC Root开始对堆中对象进行可达性分析 递归扫描整个堆里的对象图 找出要回收的对象 耗时长 但可以与用户线程并发执行 对图扫描完成后还需重新处理SATB记录下的在并发时有引用变动的对象
  3. 最终标记 对用户线程做一个短暂的暂停 处理并发阶段结束后仍遗留下来的少量SATB记录
  4. 筛选回收 更新Region的统计数据 对各个Region的回收价值和成本进行排序 根据期望停顿时间制定回收计划 将要回收的Region中存活对象复制到空的Region中 再清理掉整个旧Region全部空间 涉及存活对象的移动 必须暂停用户线程 由多条收集器线程并行完成

G1与CMS对比

  1. 可以指定最大停顿时间
  2. 按收益动态确定回收集
  3. 与CMS的标记-清除不同 G1整体看上去是基于标记-清除算法 但是从局部上看是标记-复制算法 意味着G1运作期间不会产生内存空间碎片 垃圾手机完成后能提供规整的可用内存
  4. G1为了垃圾收集所产生的的内存占用与程序运行时的额外执行负载比CMS要高
  5. 都使用卡表来处理跨代指针 但G1的卡表实现更复杂 占用更多内存空间 而CMS的卡表只有一份而且只用处理老年代到新生代的引用
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值