美文网首页
GC算法总结

GC算法总结

作者: 学编程的小屁孩 | 来源:发表于2020-03-09 17:20 被阅读0次

对象内存分配回收

对象创建优先放栈里,对象太大放到老年区;对象小的现在伊甸园区分配一块小空间TLAB(线程本地分配缓冲)给线程,把对象放到E区;E区回收时,还存活的对象放到S1,涨了一岁后还存活的放到S2。年龄都大的放到老年区,O区放不下时触发FGC。

对象分配及回收流程

垃圾回收器组合

垃圾回收器组合

注:图中有连线相连的,表示可以搭配使用,如新生代ParNew + 老年代CMS。

YoungGC = MinorGC:对新生代进行回收,在Eden区满的时候触发;
FullGC:新生代+老年代同时回收,即对整个堆进行回收,老年代满了会触发。

根可达的根

线程栈变量、静态变量、常量池、JNI指针

image.png

1、新生代收集器(Eden + S0 + S1,标记复制)

  1. Serial

    1. 单线程版本,只有一个gc线程;

    2. gc线程与用户线程串行执行,STW;

    3. 适用于:client模式下,虚拟机内存分配不大、单cpu环境时,减少切换开销,高效执行回收;

  2. ParNew

    1. 多线程版本的serial收集器,策略等完全一样;

    2. 多个gc线程并行回收,专注于减少STW时长,提升响应速度;

    3. 更适合用于,与用户交互的程序;stw越短体验越好

  3. Parallel Scavenge

    1. 多gc线程并行收集

    2. 自适应策略,自动调节新老代大小比例等参数,专注于可控制的吞吐量(吞吐量 = 运行用户代码时间 / (运行用户代码时间 + 垃圾收集时间))

    3. 更适用于非用户交互的后台计算程序等;

2、老年代收集器

  1. Serial old

    1. Serial 收集器的老年代版本;

    2. 适用于client模式下的老年代收集;

    3. 作为CMS收集器的后备预案,在并发收集发射Concurrent Mode Failure时使用;

      image
  2. Parallel Old

    1. Parallel Scavenge 的老年代版本;

    2. 多线程 + 标记整理算法;

    3. 与Parallel Scavenge(新生代回收)组合,实现【吞吐量优先】目标;

      image
  3. CMS

    1. 以实现最短STW时间为目的,适用于注重响应速度、用户体验的服务;

    2. 主要步骤:

      image
      1. 初始标记:仅标记GC Roots能够关联的对象,STW时间很短;

      2. 并发标记:与用户线程并发执行,无STW,用于GC Roots Tracing的分析过程,耗时较长;

      3. 重新标记:用于修正并发标记期间由于用户线程同时执行导致标记变动的记录,STW时间较短,但比初始标记长;

      4. 并发清除:与用户线程同时进行,清除标记的垃圾;

    3. 存在的问题:

      1. 采用标记清除算法,产生碎片,导致频繁的FullGC,可以设置-XX:+UseCMSCompactAtFullCollection(默认开启),在FullGC时进行内存碎片整理;可以设置-XX:CMSFullGCsBeforeCompaction,标识执行多少次不带压缩的FullGC后执行一次带压缩的;

      2. 对cpu资源敏感,gc线程占用cpu资源导致吞吐量下降。默认启动线程数是 (CPU数量 + 3)/4,如果只有一两个cpu,则吞吐量将下降50%!!!

      3. 易产生“浮动垃圾”:由于并发清除阶段,用户线程在并发执行产生的新的垃圾得不到及时回收;用户线程的执行也需要预留足够的空间,如预留空间不够,则会出现Concurrent Mode Failure,只能使用Serial old收集器重新收集,导致STW更长!!!

三色标记
白色:未标遍历到对象
灰色:自己标记完指向的未标记
黑色:自己及指向对象标记完
三色标记会产生错标,通过remark再次swp重新标记。

  1. G1(Garbage First)

    1. 多线程可以与用户线程并发执行;

    2. 不会产生碎片:基于region的设计,整体采用标记整理算法,局部两个region之间基于复制算法实现;

      image
    3. 可控可预测的STW时间:记录维护各个region的回收价值,优先收集回收价值高的region(只回收部分region,避免回收整个老年代)

    4. 主要步骤:

      image
      1. 初始标记:类比CMS

      2. 并发标记:类比CMS

      3. 最终标记:类比CMS

      4. 筛选回收:不同于CMS,根据用户设定的允许收集时长,选取部分高回收价值的region,优先收集。

        1. 避免FullGC,可控STW时间

        2. 不牺牲吞吐性能

        3. 不会产生内存碎片,有利于长期运行;

SATB(Snapshot At The Begining)
当A指向B的引用消失前,把指向B的引用推到GC堆栈RememberSet中,保证B还可以被GC扫描到。

  1. ZGC
    颜色指针:64bit中42个bit空间指向对象,18个bit保留,四个bit做标志位。
    当对象移动中时,当代移动完才能引用。

ZGC管理最大内存:2^42 = 4T

image.png

JVM实战

  • 查看JVM参数
    java -XX:+PrintFlagsFinal
  • 查看JVM参数个数
    java -XX:+PrintFlagsFinal | wc -l
  • 列出Java进程
    jps
  • 小工具
    arthas

相关文章

  • GC算法总结

    对象内存分配回收 对象创建优先放栈里,对象太大放到老年区;对象小的现在伊甸园区分配一块小空间TLAB(线程本地分配...

  • HotSpot JVM GC收集器学习总结

    HotSpot JVM中GC收集器学习总结:分代回收 + 收集算法 1. GC收集器(Overview) 2. C...

  • chapter-4 GC算法与种类

    GC 算法与种类 ■ GC的概念■ GC算法• 引用计数法• 标记清除• 标记压缩• 复制算法■可触及性■ Sto...

  • Lua GC

    一、GC的原理及其算法设计 不同的语言,对GC算法的设计不同,常见的GC算法是引用计数和Mark-Sweep算法,...

  • GC算法基础

    英文原文:GC Algorithms: Basics译者:有孚译文地址:GC算法基础 在深入GC算法的实现细节之前...

  • Java GC

    摘要 总结了下jvm 的通用的gc算法以及概念。主要记录思路为 问题定义回收哪些对象如何回收相关阅读自带问题 GC...

  • java性能优化

    压测工具 基准性能数据 方面 代码算法 JVM gc算法 gc收集器

  • 阿里菜鸟国际Java研发面经(三面+总结):JVM+架构+MyS

    Java面试的重点总结: 数据结构与算法,JVM内存结构、垃圾回收器、回收算法、GC、并发编程相关(多线程、线程池...

  • Android内存优化

    GC算法 当内存不足时,系统就会触发GC,GC采用垃圾标记算法为跟搜索算法 从图中可以看书obj4是科大的对象,标...

  • JVM GC算法与GC执行流程

    JVM GC算法 可达分析算法 GC执行流程 https://www.jianshu.com/p/314272e6...

网友评论

      本文标题:GC算法总结

      本文链接:https://www.haomeiwen.com/subject/ujnpdhtx.html