本章中将为各位说明GC 中的基本概念。 1.1 对象/ 头/ 域 对象这个词,在不同的使用场合其意思各不相同。比如,在面向对象编程中,它指“具有属性和行为的事物”,然而在GC 的世界中,对象表示的是“通过应用程序利用的数据的集合”。 对象配置在内存空间里。GC 根据情况将配置好的对象进行移动或销毁操作。因此,对象是GC 的基本单位。本书中的所有“对象”都表示这个含义。 一般来说,对象由头(header)和域(field)构成。我们下面将对其逐一说明。 1.1.1 头 我们将对象中保存对象本身信息的部分称为“头”。头主要含有以下信息。 • 对象的大小 • 对象的种类 如果不清楚对象的大小和种类,就会发生问题,例如无法判别内存中存储的对象的边界。因此头对GC 来说非常重要。 此外,头中事先存有运行GC 所需的信息。然而根据GC 算法的不同,信息也不同。比如将在第2 章中介绍的GC 标记- 清除算法,就是在对象的头部中设置1 个flag(标志位)来记录对象是否已标记,从而管理各个对象。 因为任何GC 算法中都会用到对象大小和种类的信息,所以本书就不专门在图中将其标记出来了。另一方面,我们会将标志位等算法特有的信息作为对象的一部分明确写出。 1.1.2 域 我们把对象使用者在对象中可访问的部分称为“域”。可以将其想成C 语言中结构体的成员,这样就很简单了吧。对象使用者会引用或替换对象的域值。另一方面,对象使用者基本上无法直接更改头的信息。 域中的数据类型大致分为以下2 种。 • 指针 • 非指针 指针是指向内存空间中某块区域的值。用C 语言和C++ 语言编程过的读者对它应该很熟悉了吧。即使是像Java 这样语言使用者没有明确用到指针的编程语言,语言处理程序内部也用到了指针。关于指针,我们在1.2 节中再详细介绍。 非指针指的是在编程中直接使用值本身。数值、字符以及真假值都是非指针。在对象内部,头之后存在1 个及1 个以上的域。在“算法篇”中,对象、头以及域的关系如图1.1 所示。 图1.1 对象、头以及域 为了更简单地向大家说明,我们事先把“算法篇”中域的大小全设成1 个字A。 A 字是计算机进行数据处理和运算的单位。字由若干字节构成,字的位数叫作字长,不同档次的机器有不同的字长 。例如一台8 位机的字长为8 位,一台16 位机的字长为16 位。 此外在伪代码中,可以用obj.field1、obj.field2…… 来从头按顺序访问对象obj 的各个域。
垃圾回收的算法与实现——1.1 对象/ 头/ 域
书名: 垃圾回收的算法与实现
作者: 中村成洋 | 相川光
出版社: 人民邮电出版社
原作名: ガベージコレクションのアルゴリズムと実装
译者: 丁灵 | 相川光
页数: 456
定价: 99.00元
装帧: 平装
ISBN: 9787115427472