JVM中的GC算法

一、前言

最近后台工作的活有点少,闲来回顾了 JVM 的东西,依旧挺有趣的,小结分享。

本文的图片来自网上。

二、算法

图解 + 按点小结

1. 引用计数

JVM中的GC算法_第1张图片

  1. 原理
  • 原理是此对象有一个引用,即增加一个计数,删除一个引用则减少一个计数
  • 垃圾回收时,只用收集计数为 0 的对象。
  1. 缺点:
  • 引用和去引用伴随加法和减法,影响性能
  • 很难处理循环引用
    JVM中的GC算法_第2张图片
  1. 其他应用
  • Python

2. 标记 - 清除

JVM中的GC算法_第3张图片

  1. 原理

此算法执行分两阶段。

  • 标记阶段:标记所有从根节点开始的可达对象
  • 清除阶段:清除所有未被标记的对象
  1. 缺点

此算法需要暂停整个应用,同时,会产生内存碎片

3. 标记 - 压缩

  1. 原理
  • 从根节点开始,对所有可达对象做一次标记。
  • 将所有的存活对象压缩到内存的一端。之后,清理边界外所有的空间。
    JVM中的GC算法_第4张图片
  1. 优势
  • 能够整理内存碎片,避免分配大对象时,空间不够导致 FullGC
  • 避免了“复制”算法的空间浪费问题
  1. 缺点
  • 移动对象成本
  1. 应用
  • 适合用于存活对象较多的场合,如老年代

4. 复制算法

JVM中的GC算法_第5张图片

  1. 原理
  • 此算法把内存空间划为两个相等的区域,每次只使用其中一个区域
  • 垃圾回收时,遍历当前使用区域,把正在使用中的对象复制到另外一个区域中
  1. 优点
  • 没有标记、清除的过程,效率高
  • 没有内存碎片
  1. 缺点
  • 空间浪费
  1. 应用
  • 不适用于存活对象较多的场合,如老年代

你可能感兴趣的:(JVM中的GC算法)