JVM垃圾回收

2022-4-12 diaba JVM



怎么定义垃圾

引用计数法

  • 循环引用问题(循环依赖问题)

可达性分析法

  • GC Roots
    • 虚拟机栈(栈帧中的本地变量表)中应用的对象
    • 方法区中类静态引用的对象
    • 方法区中常量引用的对象
    • 本地方发展中JNI引用的对象

怎么回收垃圾

标记-清除算法

  • 步骤
    • 标记内存中哪些可以被清理
    • 清理掉可以被清理的对象
  • 问题
    • 内存碎片

复制算法

  • 步骤

    • 可用内存分成两份,每次只使用其中一块
    • 存活对象复制到另一块,然后使用的内存空间一次清理掉
  • 特点

    • 解决内存碎片问题
    • 但是空间浪费

标记-整理算法

  • 步骤

    • 标记内存中哪些可以被清理(也知道哪些存活)
    • 存活对象都向一端移动
    • 清理边界以外内存区域
  • 特点

    • 无碎片问题
    • 规避使用一半内存的弊端
    • 因为整理过程效率低下

分代收集算法

严格来说并不是一种思想或理论,而是融合上述 3 种基础的算法思想,而产生的针对不同情况所采用不同算法的一套组合拳。

  • 根据对象存活周期不同把内存划分为几块,可以根据各个年代特点选择适当的收集算法

    • 新生代
      • 复制算法
    • 老年代
      • 标记-清除算法  标记-整理算法
  • 内存模型与回收策略

    • 年轻代(1/3)
      • Eden区(8/10)
        • Minor GC(频繁,16次之后进入老年代)
      • Survivor区(这种设计,最大的好处是可以解决内存碎片问题)
        • From(1/10)
        • To(1/10)
    • 老年代(2/3)
      • Major GC(stop the world)


发表评论:

Powered by emlog 京ICP备15045175号-1 Copyright © 2022