GC定义

GC是Garbage Collection的简称,也就是我们常说的垃圾回收。GC把程序已分配但是不再使用的内存空间视为垃圾。GC程序主要做两件事:

  1. 找到内存空间里的垃圾
  2. 回收这部分内存,以供程序员后续能再次使用

对于没有GC的语言,程序员就必须手动管理内存,如果忘记释放内存空间,就容易发生内存泄露,最终导致系统崩溃。另外,错误的释放内存可能会引起难以确定以及恶性的bug。现在大多数语言都内置了GC,让程序员的精力集中在更本质的编程工作上,提高开发效率。

GC中术语

对象

对象配置在内存空间里,GC根据情况将已创建的对象进行移动或销毁操作,是GC操作的基本单位。对象一般又包含两部分:头(header)和域(field)。

  • 对象的头保存了当前对象本身的基本信息,主要包括对象的大小、对象的种类,主要用于判断内存中对象的存储边界。另外根据不同的算法实现,头还会包含一些特有的信息。

  • 对象的域保存了对象的可访问部分,就是我们程序中定义的各个成员。一般来说,域中的数据类型分为指针和非指针。在大多数语言中,指针都默认指向对象的首地址。

堆是程序运行时动态存放对象的内存空间,当需要申请对象时,所需的内存空间就会从这个堆中被分配给程序。GC管理的就是堆中的内存空间。

根是指向堆中对象的起点,根能在程序中直接被引用,调用栈、寄存器以及全局变量空间都是根。

对象、堆、根的关系可以表示如下:

gc术语

评判标准

gc执行

评判GC算法的性能时,主要从4个方面考虑:

  • 吞吐量

    吞吐量是指单位时间内的GC处理能力,以上图来说,对于大小为HEAP_SIZE的堆,吞吐量就是HEAP_SIZE/(A+B+C)

  • 最大暂停时间

    单位时间内因执行GC所暂停程序的时间,以上图来说,就是A+B+C

  • 堆使用效率

    堆的实际使用大小,一般来说,越要有效率的使用堆,GC花费的时间越长

  • 访问局部性

    一般执行GC后,堆中的对象会重新分布,把具有引用关系的对象安排在堆中较近的位置,就能提高在缓存中读取到想利用的数据的概率。

GC算法

GC技术出现的非常早,主要分为三种GC算法:

  • GC标记-清除算法

  • 引用计数法

  • GC复制算法

在第三种GC算法发明后,GC的根本性内容已经完成,现在各种的GC算法,本质上都是这三种算法的组合应用。