Autumn_Ning_Blog
Autumn_Ning_Blog copied to clipboard
Garbage Collection
垃圾回收
序
GC的定义
GC 是 Garbage Collection的简称,也就是垃圾回收
垃圾的回收
在GC中,垃圾指的是程序不用的内存空间
GC主要做的两件事:
- 找到内存空间的垃圾
- 回收垃圾,让程序员再次利用这部分空间
算法篇
GC的基本概念
-
对象/头/域
在GC的世界里,对象表示的是通过应用程序利用的数据的集合
对象配置在内存空间里,GC把配置好的对象进行移动或销毁操作,因此,对象是GC的基本单位。
一般来说,对象由头和域构成
-
头
将对象中保存对象本身信息的部分称为”头“
- 对象的大小
- 对象的种类
如果不清楚对象的大小和种类,就会发生问题,无法判别内存中存储的对象的边界等
对于不同的GC算法,头里面提供的信息也是不同的
-
域
对象使用者在对象中可访问的部门称为“域”,对象使用者会引用或替换对象的域值。另一方面,对象使用者基本上无法直接改变头的信息
域中的数据类型大致分为以下两种
- 指针
- 非指针

-
-
指针
通过GC,对象会被销毁或保留,这时候起到关键作用的就是指针,因为GC是根据对象的指针指向去搜寻其他对象的,GC对于非指针不进行任何操作
指针如果指向的对象首地址以外的部分,GC就会变得非常复杂,在大多数语言处理程序中,指针都默认指向对象的首地址

B和C称为A的子对象,对某个对象的子对象进行某项处理是GC的基本操作
-
mutator
mutator,是“改变某物”的意思,那要改变什么呢? 那就是GC对象间的引用关系,它的实体就是“应用程序” mutator进行的实际操作:
- 生成对象
- 更新指针
mutator在进行这些操作时,会同时为应用程序的用户进行一些处理,随着这些处理的增加,对象间的引用关系也会发生“改变”,随之,也会产生垃圾,负责回收这些垃圾的机制就是GC
-
堆
堆值得是用于动态(也就是执行程序时)存放对象的内存空间,当mutator申请存放对象时,所需的内存空间就会从这个堆中分配给mutator
GC时管理堆中已分配对象的机制,在开始执行mutator前,GC要分配用于堆的内存空间,一旦开始执行mutator,程序就会按照Mutator的要求在堆中存放对象,等到堆被对象占满之后,GC就会启动,从而分配可用空间,如果不能分配足够的可用空间,就要扩大堆
-
活动对象/非活动对象
活动对象:我们将分配到内存空间中的对象中那些能通过mutator引用的对象
非活动对象:把分配到堆中哪些不能通过程序引用的对象称为"非活动对象",也就是我们称作的“垃圾”
死了的对象不可能活过来,因为就算用mutator重新引用已经死掉的对象,我们也没有办法通过mutator找到它
因此,GC会保留活动对象,销毁非活动对象,当销毁非活动对象时,其原本占据的内存空间就会得到释放,供下一个要分配的新对象使用

-
分配
分配指的是在内存空间中分配对象,当mutator需要新对象时,就会向分配器申请一个大小合适的空间,分配器则在堆的可用空间中找寻满足要求的空间,返回给Mutator
当堆被所有活动对象占满时,就算运行GC也没有办法分配可用空间,有两个选择
- 销毁至今为止的所有计算结果,输出错误信息
- 扩大堆,分配可用空间
-
分块
分块在GC的世界里指的是利用对象而事先准备出来的空间
初始状态下,堆被一个大的分块所占据,然后程序会根据mutator的要求把这个分块分割成合适的大小,作为活动对象使用,活动对象不久后被转换为垃圾被回收,然后可能又再次成为分块,为下次利用做准备
-
根
根,在GC的世界里,是指向对象的指针的起点部分
-
评价标准
评价GC算法的性能时,采用下面4个方法:
-
吞吐量
指的是单位时间内的处理能力,

在mutator整个执行过程中,GC启动了3次,而且以GC为对象的堆大小是HEAP_SIZE,所以GC的吞吐量为HEAP/(A+B+C)
GC复制算法只检查活动对象,而GC标记-清除算法则会检查所有的活动和非活动对象
-
最大暂停时间
所有的GC算法都会在GC执行过程中令mutator暂停执行,最大暂停时间指的是因执行GC而暂停执行mutator的最长时间,上图中的最大暂停时间就是B
-
堆使用效率
可用的堆越大,GC运行越快,越想有效的利用有限的堆,GC话费的时间就越长
-
访问的局部性
由于寄存器和缓存的存储容量小,所以一般我们会把数据放在内存里,当CPU访问数据时,仅把使用的数据从内存读取到缓存中,与此同时,还将它附近的所有数据都读区到缓存中,从而压缩读取数据所需要的时间
由于“访问局部性”的原因,会把具有引用关系的对象安排在堆中较劲的位置。
-