GC定义
GC是Garbage Collection的简称,也就是我们常说的垃圾回收。GC把程序已分配但是不再使用的内存空间视为垃圾。GC程序主要做两件事:
- 找到内存空间里的垃圾
- 回收这部分内存,以供程序员后续能再次使用
对于没有GC的语言,程序员就必须手动管理内存,如果忘记释放内存空间,就容易发生内存泄露,最终导致系统崩溃。另外,错误的释放内存可能会引起难以确定以及恶性的bug。现在大多数语言都内置了GC,让程序员的精力集中在更本质的编程工作上,提高开发效率。
GC中术语
对象
对象配置在内存空间里,GC根据情况将已创建的对象进行移动或销毁操作,是GC操作的基本单位。对象一般又包含两部分:头(header)和域(field)。
头
对象的头保存了当前对象本身的基本信息,主要包括对象的大小、对象的种类,主要用于判断内存中对象的存储边界。另外根据不同的算法实现,头还会包含一些特有的信息。
域
对象的域保存了对象的可访问部分,就是我们程序中定义的各个成员。一般来说,域中的数据类型分为指针和非指针。在大多数语言中,指针都默认指向对象的首地址。
堆
堆是程序运行时动态存放对象的内存空间,当需要申请对象时,所需的内存空间就会从这个堆中被分配给程序。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算法,本质上都是这三种算法的组合应用。