JVM GC算法和垃圾收集器

版权声明:不短不长八字刚好@wzy https://blog.csdn.net/qq_38089964/article/details/85867874

算法

  • 标记-清除:产生大量离散碎片
  • 复制算法:三个区域eden(大)+2*survivor(小);每次在eden新建对象,gc的时候复制到另外一个survivor中,清除以前的两个区域。
  • 标记-整理:压缩可用区域,将可用对象挤在一起

垃圾收集器
垃圾收集器

  • Serial 收集器(新生代):单线程阻塞所有用户进程,采用复制算法清理新生代
  • Serial Old 收集器(老年代):Serial的老年代收集版本,采用标记整理算法
    垃圾收集器
  • ParNew 收集器(新生代):Serial的多线程版本,采用多线程复制算法
  • Parallel Scavenge 收集器(新生代):和ParNew类似,更专注于提高吞吐量(=运行代码时间/运行代码时间+GC时间),自适应调节各个区域的比例、晋升老年代对象大小,达到一个更高的吞吐量
    垃圾收集器
  • Parallel Old收集器(老年代):于Parallel Scavenge配合,多线程标记整理算法回收老年代
    垃圾收集器
  • CMS收集器(Concurrent Mark Sweep)(老年代):多线程标记清除算法。
    步骤:
    • 初始标记:标记GC ROOT直接关联对象
    • 并发标记:从GC ROOT一路往下标记
    • 重新标记:标记用户程序变化的那一部分
    • 并发清理:清理无效对象

垃圾收集器

  • G1 收集器(整个堆):将堆内存划分成很多的大小相等的独立区域,然后标记之后对每个区域的回收价值大小排序,优先从价值大的区域开始回收。
    将需要回收的区域存活对象复制到其他不需要回收的区域中。
    步骤:(每个区域有一个数据结构保存该区域的标记对象集合)
    • 初始标记:标记GC ROOT直接关联对象
    • 并发标记:从GC ROOT一路往下标记
    • 最终标记:将二次标记的结果加进本区域的标记集合中
    • 筛选回收:筛选价值最大的区域开始回收

猜你喜欢

转载自blog.csdn.net/qq_38089964/article/details/85867874