两个名词解释
- 并行:多条垃圾收集器线程间的关系 通常默认此时用户线程处于等待状态 多条线程一起执行
- 并发: 指垃圾收集器线程与用户线程的关系 多条线程交替执行
连线表示可以搭配使用 上为新生代收集器 下为老年代收集器
Serial收集器
新生代收集器 最早出现 现在仍是Hotspot默认新生代收集器 单线程工作 在进行垃圾收集时必须暂停其他所有线程
简单而高效
ParNew收集器
新生代收集器 是Serial收集器的多线程并行版本 其他与Serial基本相同 只有它能与CMS收集器配合使用
ParallelScavenge收集器
新生代收集器 基于标记-复制算法实现 能并行收集 与ParNew非常相似
特点:达到一个可控制的吞吐量(处理器用于运行用户代码的时间与处理器总消耗时间的比值) 即:
吞吐量 = 运行用户代码时间 / 用户运行代码时间+运行垃圾收集时间
该收集器也被称作“吞吐量优先收集器”
有自适应的调节策略:动态调整参数以提供最适合的停顿时间或最大吞吐量
Serial Old收集器
是Serial收集器的老年代版本 单线程收集器 使用标记-整理算法
主要用在客户端模式的Hotspot虚拟机使用 如果在服务端模式使用可以作为CMS收集器发生失败时的后备预案
Parallel Old收集器
是Parallel Scavenge收集器的老年代版本 两者相互搭配 支持多线程并发收集 基于标记-整理算法
CMS收集器
Concurrent Mark Sweep 并发收集低停顿
以获取最短回收停顿时间为目标的收集器 集中应用在互联网网站或者基于浏览器的B/S系统的服务端上 关注服务的响应速度 基于标记-清除算法实现
运作过程:
- 初始标记
- 并发标记
- 重新标记
- 并发清除
其中初始标记和重新标记仍然需要停止其他线程
初始标记仅标记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容量的一半
运作过程:
- 初始标记 仅标记GC Roots能直接关联的对象 并修改TAMS指针的值 让下一阶段用户线程并发运行时能正确的在Region中分配对象 需要停顿线程但是时间短
- 并发标记 从GC Root开始对堆中对象进行可达性分析 递归扫描整个堆里的对象图 找出要回收的对象 耗时长 但可以与用户线程并发执行 对图扫描完成后还需重新处理SATB记录下的在并发时有引用变动的对象
- 最终标记 对用户线程做一个短暂的暂停 处理并发阶段结束后仍遗留下来的少量SATB记录
- 筛选回收 更新Region的统计数据 对各个Region的回收价值和成本进行排序 根据期望停顿时间制定回收计划 将要回收的Region中存活对象复制到空的Region中 再清理掉整个旧Region全部空间 涉及存活对象的移动 必须暂停用户线程 由多条收集器线程并行完成
G1与CMS对比
- 可以指定最大停顿时间
- 按收益动态确定回收集
- 与CMS的标记-清除不同 G1整体看上去是基于标记-清除算法 但是从局部上看是标记-复制算法 意味着G1运作期间不会产生内存空间碎片 垃圾手机完成后能提供规整的可用内存
- G1为了垃圾收集所产生的的内存占用与程序运行时的额外执行负载比CMS要高
- 都使用卡表来处理跨代指针 但G1的卡表实现更复杂 占用更多内存空间 而CMS的卡表只有一份而且只用处理老年代到新生代的引用

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

被折叠的 条评论
为什么被折叠?



