目录

ThasBlog

学无止境

X

JVM GC

对象引用

  • 强引用

  • 软引用

    OOM之前回收

  • 弱引用

    GC扫描到就回收

  • 幻象引用

    不可使用

对象存活分析

  • 引用计数

  • 可达性分析

    GCRoots:

    • 栈上引用
    • 存货的线程
    • 方法区静态变量引用
    • 方法区常量引用
    • 本地方法栈引用

对象晋级原则

  • MinorGC

    • Eden区进入Suvivor区
    • Suvivor区对象年龄+1
    • Suvivor对象年龄达到15(MaxTenuringThreshold可以设置, CMS为4), 晋级到老年代
    • Suvivor对象年龄从小到大计算总和, 到达50%, 超过的年龄将作为新的年龄上限
    • 大对象无法在新生代分配, 直接分配在老年代
  • MajorGC

    只有CMS可以独立执行, 其他回收器都会伴随MinorGC.

垃圾回收算法

  • 复制
  • 标记清除
  • 标记整理

经典垃圾回收器

image.png

Serial/Serial Old

初代GC, 单线程模式, 必须要Stop The World

SerialOld 是最经典的老年代GC, 可以与任意的新生代GC一同使用

ParNew/ConcurrentMarkSweep

ParNew是新生代并行收集器, Serial的多线程版本

CMS 是并发GC, 可以与用户程序一同运行, 关注停顿时间, 吞吐量不高

  1. 初始标记
    标记GC Roots以及直接引用的对象, 需要stop the world
  2. 并发标记
    从初始标记的对象开始继续往下标记存活对象, 此阶段可以与用户线程同时运行, 用户不会感受的停顿
  3. 并发预清理
    处理并发阶段新产生的对象, 晋级的对象, 更改过的对象(尽可能减少重新标记阶段的工作量)
  4. 重新标记
    并发标记过程, 用户线程可能会修改对象引用, GC会监听那些改动, 在这一阶段将并发标记的内容和改动的内容进行合并, 得到准确的对象关系网, 确定清理目标
  5. 并发清理
    清理重新标记过程确定的清理目标, 此阶段新产生的垃圾, 本次GC过程不再处理
  6. 重置标记
    并发清楚本次GC的标记

parallel scavenge/parallel old

吞吐量优先的并行收集器

G1


标题:JVM GC
作者:thas
地址:https://thas.cc/articles/2020/10/12/1602514470235.html