序章
GC的定义
GC是Garbage Collection的简称
垃圾的回收
垃圾就是程序不用的内存空间
GC要做两件事
- 找到内存空间里的垃圾
- 回收垃圾,让程序能再次利用这部分空间
没有GC的世界
没有GC,程序员就需要手动内存管理,手动申请内存不成问题,但是手动释放内存(一个不漏)非常难
如果忘记释放内存空间,则会发生内存泄漏,泄露的空间无法被使用,又会持续存在下去.总有一天内存会被占满,甚至导致系统崩溃
如果释放空间时,忘记释放指向释放对象的内存空间的指针,则它没有指向有效的内存空间,处于一种悬挂状态,称为悬垂指针(dangling pointer).会导致无法预期的bug和安全漏洞
如果释放了还要被使用的空间,则下一次程序可能发生故障,大多数情况下会发生段错误,引发bug
和内存相关的bug,共同之处在于”难以确定bug的原因”,因为与内存相关的bug的潜在场所和bug出现的场所在位置上或时间上不一致
有GC的世界
省去手动内存管理的麻烦,可以不用担心内存管理可能出现的bug
GC的历史
GC是一门古老的技术
GC因JAVA的发布而成名,最初的GC是John McCarthy在1960年发布的
GC标记-清除算法
1960年,由John McCarthy在论文中发布
引用计数法
1960年,George E. Collins在论文中发布.但是Harold McBeth在1963年指出,引用计数法有一个缺点,即不能解决循环引用(两个及两个以上对象循环互相引用)
GC复制算法
1963年,Marvin L. Minsky在论文中发布.GC复制算法把内存分成两部分
50年来,GC的根本没有改变
这50年间,新算法基本只是把前文提到的3种算法进行组合或应用
未知的第四种算法
还未出现
为什么我们现在要学GC
GC–存在即合理
大多数语言都搭载GC
不同场景使用GC算法不同: 游戏场景,需要选用GC导致的暂停时间最短的算法;编码应用场景(如音乐和动画),则需要选用整体处理时间最短的算法
多种多样的处理程序的实现
近来,有一股发布语言处理程序的风潮,它们搭载不同的GC算法,优秀的GC也是语言的一大卖点
GC性能是语言处理程序的性能评价的一大要素
留意内存空间的用法
比如在使用java时不留意内存管理,而无意中把内存挥霍一空(比如循环里创建无用的对象)
不会过时的技术
更何况,GC很有趣
读者对象
本书由1.算法篇和2.实现篇组成
读实现篇需要有c和c++的知识(c的函数指针,c++的模板)
其他
算法篇
1. 学习gc之前
1.1 对象/头/域
GC的世界中,对象表示”通过应用程序利用的数据的集合”.对象配置在内存空间里.GC根据情况间配置好的对象进行移动或销毁操作,因此,对象是GC的基本单位.
对象一般由头(header)和域(field)构成
1.1.1 头
保存对象本身信息(对象和种类)的部分
不同GC,头存的信息也不同