图片


Serial

特点:

  • JDK 1.3 开始提供

  • 新生代收集器

  • 无线程交互开销,单线程收集效率最高

  • 进行垃圾收集时需要暂停用户线程

  • 适用于客户端,小内存堆的回收



ParNew

特点:

  • 是 Serial 收集器的多线程并行版

  • JDK 7 之前首选的新生代收集器

  • 第一款支持并发的收集器,首次实现垃圾收集线程与用户线程基本上同时工作

  • 除 Serial 外,只有它能与 CMS 配合



Parallel Scavenge

特点:

  • 新生代收集器

  • 标记-复制算法

  • 多线程并行收集器

  • 追求高吞吐量,即最小的垃圾收集时间

  • 可以配置最大停顿时间、垃圾收集时间占比

  • 支持开启垃圾收集自适应调节策略,追求适合的停顿时间或最大的吞吐量



Serial Old

特点:

  • 与 Serial 类似,是 Serial 收集器的老年代版本

  • 使用标记-整理算法



Parallel Old

特点:

  • JDK 6 开始提供

  • Parallel Scavenge 的老年代版

  • 支持多线程并发收集

  • 标记-整理算法

  • Parallel Scavenge + Parallel Old 是一个追求高吞吐量的组合



CMS

特点:

  • 标记-清除算法

  • 追求最短回收停顿时间

  • 多应用于关注响应时间的 B/S 架构的服务端

  • 并发收集、低停顿

  • 占用一部分线程资源,应用程序变慢,吞吐量下降

  • 无法处理浮动垃圾,可能导致 Full GC

  • 内存碎片化问题



G1

特点:

  • JDK 6 开始实验,JDK 7 商用

  • 面向服务端,JDK 9 取代 Parallel Scavenge + Parallel Old

  • 结合标记-整理、标记-复制算法

  • 首创局部内存回收设计思路

  • 基于 Region 内存布局,采用不同策略实现分代

  • 不再使用固定大小、固定数量的堆内存分代区域划分

  • 优先回收价收益最大的 Region

  • 单个或多个 Humongous 区域存放大对象

  • 使用记忆集解决跨 Region 引用问题

  • 复杂的卡表实现,导致更高的内存占用,堆的 10%~20%

  • 全功能垃圾收集器

  • 追求有限的时间内最高收集效率、延迟可控的情况下最高吞吐量

  • 追求应付内存分配速率,而非一次性清掉所有垃圾内存

  • 适用于大内存堆



Shenandoah

特点:

  • 追求低延迟,停顿 10 毫秒以内

  • OpenJDK 12 新特性,RedHat 提供

  • 连接矩阵代替记忆集,降低内存使用与伪共享问题出现概率



ZGC

特点:

  • JDK 11 新加的实验性质的收集器

  • 追求低延迟,停顿 10 毫秒以内

  • 基于 Region 内存布局

  • 未设分代

  • 读屏障、染色指针、内存多重映射实现可并发的标记-整理算法

  • 染色指针和内存多重映射设计精巧,解决部分性能问题,但降低了可用最大内存、操作系统受限、只支持 32 位、不支持压缩指针等

  • 成绩亮眼、性能彪悍


更多相关文章

  1. Java 类的静态变量存放在哪块内存中?
  2. volatile如何避免指令重排序?原来使用了内存屏障
  3. Redis5.0中的内存淘汰策略详解(最新的版本)
  4. JVM系列(7)内存溢出问题(工作中常用、面试中常问的一个知识点)
  5. java关键字系列(2)static(内存角度分析,格式调整版)
  6. JS内存泄漏排查方法
  7. 什么是 Java 内存模型?

随机推荐

  1. android屏保源码
  2. Android--ListView 分割线
  3. android API版本对应的系统版本及Android
  4. default locale 设置地区
  5. android EditText 不自动获取焦点并弹出
  6. android仿漫画源码、抽奖转盘、Google相
  7. 开关
  8. Android关机重启
  9. Android NDK 简介(Android NDK 教程 一)
  10. 《Android系统学习》第十一章:Android应用