本章中将为各位说明GC 中的基本概念。 1.1 对象/ 头/ 域 对象这个词,在不同的使用场合其意思各不相同。比如,在面向对象编程中,它指“具有属性和行为的事物”,然而在GC 的世界中,对象表示的是“通过应用程序利用的数据的集合”。 对象配置在内存空间里。GC 根据情况将配置好的对... 查看全部[ 1.1 对象/ 头/ 域 ]
通过GC,对象会被销毁或保留。这时候起到关键作用的就是指针。因为GC 是根据对象的指针指向去搜寻其他对象的。另一方面,GC 对非指针不进行任何操作。 在这里有两点需要我们注意。 首先,要注意语言处理程序是否能判别指针和非指针。要判别指针和非指针需要花费一定的功夫,关于这一点我们会在第6 ... 查看全部[ 1.2 指针 ]
mutator 是Edsger Dijkstra [15] 琢磨出来的词,有“改变某物”的意思。说到要改变什么,那就是GC 对象间的引用关系。不过光这么说可能大家还是不能理解,其实用一句话概括的话,它的实体就是“应用程序”。这样说就容易理解了吧。GC 就是在这个mutator 内部精神饱满地工作着。... 查看全部[ 1.3 mutator ]
堆指的是用于动态(也就是执行程序时)存放对象的内存空间。当mutator 申请存放对象时,所需的内存空间就会从这个堆中被分配给mutator。 GC 是管理堆中已分配对象的机制。在开始执行mutator 前,GC 要分配用于堆的内存空间。一旦开始执行mutator,程序就会按照mutator ... 查看全部[ 1.4 堆 ]
我们将分配到内存空间中的对象中那些能通过mutator 引用的对象称为“活动对象”。反过来,把分配到堆中那些不能通过程序引用的对象称为“非活动对象”。也就是说,不能通过程序引用的对象已经没有人搭理了,所以死掉了。死掉的对象(即非活动对象)我们就称为“垃圾”。 这里需要大家注意的是:死了的对象不... 查看全部[ 1.5 活动对象/ 非活动对象 ]
分配(allocation)指的是在内存空间中分配对象。当mutator 需要新对象时,就会向分配器(allocator)申请一个大小合适的空间。分配器则在堆的可用空间中找寻满足要求的空间,返回给mutator。 像Java 和Ruby 这些配备了GC 的编程语言在生成实例时,会在内部进行分配... 查看全部[ 1.6 分配 ]
分块(chunk)在GC 的世界里指的是为利用对象而事先准备出来的空间。 初始状态下,堆被一个大的分块所占据。 然后,程序会根据mutator 的要求把这个分块分割成合适的大小,作为(活动)对象使用。活动对象不久后会转化为垃圾被回收。此时,这部分被回收的内存空间再次成为分块,为下次被利用... 查看全部[ 1.7 分块 ]
根(root)这个词的意思是“根基”“根底”。在GC 的世界里,根是指向对象的指针的“起点”部分。 这些都是能通过mutator 直接引用的空间。举个例子,请看下面的伪代码。 $obj = Object.new $obj.field1 = Object.new 在这里$obj... 查看全部[ 1.8 根 ]
评价GC 算法的性能时,我们采用以下4 个标准。 • 吞吐量 • 最大暂停时间 • 堆使用效率 • 访问的局部性 下面我们逐一进行说明。 1.9.1 吞吐量 从一般意义上来讲,吞吐量(throughput)指的是“在单位时间内的处理能力”,这点在GC 的世界... 查看全部[ 1.9 评价标准 ]
世界上首个值得纪念的GC 算法是GC 标记- 清除算法(Mark Sweep GC)[1]。自其问世以来,一直到半个世纪后的今天,它依然是各种处理程序所用的伟大的算法。 2.1 什么是GC标记- 清除算法 就如它的字面意思一样,GC 标记- 清除算法由标记阶段和清除阶段构成。标记阶段是把... 查看全部[ 2.1 什么是GC标记- 清除算法 ]