GC

JVM底层架构

  1. 类装载子系统
  2. 运行时数据区
  3. 执行引擎

JVM内存模型

  1. 栈(jvm栈)
    方法 临时变量

  2. 对象
  3. 本地方法栈
    c++ native方法
  4. 程序计数器
    程序当前运行的位置
  5. 方法区(元空间)
    static变量方法 classloader 全局变量信息
  • 栈 本地方法栈 程序计数器线程私有 有多少线程就有多少栈区
  • 堆 方法区是全局共享
  • 理解程序在内存中的调用过程

GC机制

  1. GCRoot标准
    被栈 本地方法栈 方法区直接引用或间接引用的对象不能被删除
  2. 标记清理算法
    缺点:会产生内存碎片
  3. 标记整理算法
    解决内存碎片问题
    缺点:所有对象前移造成的代价太大
  4. 复制算法
    内存一分为二 在一区上标记对象是否被删除 将没有标记的复制到二区
    缺点:需要两倍内存
  5. GC在堆中的划分
    年轻代Young区
    老年代Old区
  • YoungGC 复制算法 8:1:1
    Eden 伊甸园
    Survive0
    Survive1
    当E区快满时,打标记,把没有打标记的复制到S0区,然后将E区和S0区全部删除,等下一次E区快满时,将S0区和E区所有对象打标,将没有打标的复制到S1,E+S1 复制到 S0,E+S0 复制到 S1,如此,往复
    垃圾收集器ParNew

  • Old区 age >= 6 大对象(占内存很大)
    又叫FullGC,快满时FullGC会引起java程序全部的暂停,全力进行垃圾回收,采用标记清理或标记整理算法
    垃圾收集器CMS

  • 垃圾收集器 分Young Old
    CMS 1. 初次标记 GCRoot对象 STW 2. 并发标记 所有的Old对象 3. 重新标记 修正2 STW 4. 并发清理 标记清理
    D1

  • G1
    Region区域大小在1M~32M 2000个左右
    0.5 <= 所占内存 <1 存储到Old区并标记为H超大对象
    所占内存 > 1 多个连续的H区存储 H区是O区的一种
    Rset Region中有个地方存储Rset 记录其它Region引用当前Region对象
    Cset 本次GC需清理的Region集合
    Young Old区都采用G1
    Young区 E区和Sfrom区Sto区 在一次GC的过程中利用复制算法,将E区和Sfrom区拷贝到Sto区
    Old区 也叫MixGC 1. 初次标记GCRoot对象和所在Region STW 2. RootRegion去扫描Old去的所有Region,看这些Region区中的是否有Rset,直接进行引用 3. 并发标记 同CMS作用相同,不过遍历范围只是被标记的 4. 重新标记 同CMS 采用新的算法 SATB 速度更快 STW 5. 复制清理 只选择了垃圾较多的Region进行清理,虽然清理不干净,但效率高 STW

minor gc full gc

原文地址:https://www.cnblogs.com/nightrainlemon/p/11585855.html