评价GC 算法的性能时,我们采用以下4 个标准。 • 吞吐量 • 最大暂停时间 • 堆使用效率 • 访问的局部性 下面我们逐一进行说明。 1.9.1 吞吐量 从一般意义上来讲,吞吐量(throughput)指的是“在单位时间内的处理能力”,这点在GC 的世界中也不例外。 请参照图1.7 的示例。 图1.7 mutator和GC 的执行示意图 在mutator 整个执行过程中,GC 一共启动了3 次,我们把花费的时间分别设为A、B、C。也就是说,GC 总共花费的时间为(A + B + C)。另一方面,我们前面提到过,以GC 为对象的堆大小是HEAP_SIZE。也就是说,在大小为HEAP_SIZE 的堆进行内存管理,要花费的时长为(A + B + C)。因此,这种情况下GC 的吞吐量为HEAP_SIZE /(A + B + C)。 当然,人们通常都喜欢吞吐量高的GC 算法。然而判断各算法吞吐量的好坏时不能一概而论。 打个比方,众所周知GC 复制算法和GC 标记- 清除算法相比,活动对象越少吞吐量越高。这是因为GC 复制算法只检查活动对象,而GC 标记- 清除算法则会检查所有的活动和非活动对象。 然而,随着活动对象的增多,各GC 算法表现出的吞吐量也会相应地变化。极端情况下,甚至会出现GC 标记- 清除算法比GC 复制算法表现的吞吐量更高的情况。 也就是说,即便是同一GC 算法,其吞吐量也是受mutator 的动作左右的。评价GC 算法的吞吐量时,有必要把mutator 的动作也考虑在内。 1.9.2 最大暂停时间 本书“算法篇”中介绍的所有GC 算法,都会在GC 执行过程中令mutator 暂停执行。最大暂停时间指的是“因执行GC 而暂停执行mutator 的最长时间”。这么说可能比较难理解,请再看一遍图1.7。最大暂停时间是A~C 的最大值,也就是B。 那么,我们在何种情况下需要重视此种指标呢? 典型例子是两足步行的机器人。如果在其步行过程中启动GC,我们对机器人的控制就会暂时中断,直到GC 执行完毕方可重启。也就是说,在这期间机器人完全不能运作。很显然,机器人会摔倒。 再举个例子,Web 浏览器会如何呢?如果在浏览Web 网页的时候发生GC,浏览器就会看似卡住,带给用户心理负担。像Web 浏览器这样的GUI 应用,大多数都是以人机交互为前提的,所以我们不希望执行过程中长时间受到GC 的影响。 这种情况下就需要缩短最大暂停时间。然而不管尝试哪种GC 算法,我们都会发现较大的吞吐量和较短的最大暂停时间不可兼得。所以应根据执行的应用所重视的指标的不同,来分别采用不同的GC 算法。 1.9.3 堆使用效率 根据GC 算法的差异,堆使用效率也大相径庭。左右堆使用效率的因素有两个。一个是头的大小,另一个是堆的用法。 首先是头的大小。在堆中堆放的信息越多,GC 的效率也就越高,吞吐量也就随之得到改善。但毋庸置疑,头越小越好。因此为了执行GC,需要把在头中堆放的信息控制在最小限度。 其次,根据堆的用法,堆使用效率也会出现巨大的差异。举个例子,GC 复制算法中将堆二等分,每次只使用一半,交替进行,因此总是只能利用堆的一半。相对而言,GC 标记-清除算法和引用计数法就能利用整个堆。 撇开这个不说,因为GC 是自动内存管理功能,所以过量占用堆就成了本末倒置。与吞吐量和最大暂停时间一样,堆使用效率也是GC 算法的重要评价指标之一。 然而,堆使用效率和吞吐量,以及最大暂停时间不可兼得。简单地说就是:可用的堆越大,GC 运行越快;相反,越想有效地利用有限的堆,GC 花费的时间就越长。 1.9.4 访问的局部性 PC 上有4 种存储器,分别是寄存器、缓存、内存、辅助存储器。它们之间有着如图1.8所示的层级关系。 图1.8 存储器的层级构造 众所周知,越是可实现高速存取的存储器容量就越小。毫无疑问,我们都希望尽可能地利用较高速的存储器,但由于高速的存储器容量小,因此通常不可能把所有要利用的数据都放在寄存器和缓存里。一般我们会把所有的数据都放在内存里,当CPU 访问数据时,仅把要使用的数据从内存读取到缓存。与此同时,我们还将它附近的所有数据都读取到缓存中,从而压缩读取数据所需要的时间。 另一方面,具有引用关系的对象之间通常很可能存在连续访问的情况。这在多数程序中都很常见,称为“访问的局部性”。考虑到访问的局部性,把具有引用关系的对象安排在堆中较近的位置,就能提高在缓存中读取到想利用的数据的概率,令mutator 高速运行。想深入了解访问的局部性的读者,请参考《计算机组成与设计:硬件、软件接口》[29]。 有些GC 算法会根据引用关系重排对象,例如在第4 章中提到的GC 复制算法等。
垃圾回收的算法与实现——1.9 评价标准
书名: 垃圾回收的算法与实现
作者: 中村成洋 | 相川光
出版社: 人民邮电出版社
原作名: ガベージコレクションのアルゴリズムと実装
译者: 丁灵 | 相川光
页数: 456
定价: 99.00元
装帧: 平装
ISBN: 9787115427472