垃圾回收算法设计与实现

序章

GC的定义

GC是Garbage Collection的简称

垃圾的回收

垃圾就是程序不用的内存空间

GC要做两件事

  1. 找到内存空间里的垃圾
  2. 回收垃圾,让程序能再次利用这部分空间

没有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,头存的信息也不同

1.1.2 域


 上一篇
现代JavaScript库开发 现代JavaScript库开发
1. 从零开发一个JavaScript库1.1 如何开始 如何确定要开发什么库呢? 从项目中寻找灵感,将项目中的一些功能进行抽象设计,提取通用逻辑,进行额外处理,形成一个公共库的原型;一般项目中也会存在一些公共函数和组件等,是很好的灵
2023-06-22
下一篇 
mysql是怎样运行的 mysql是怎样运行的
1. 装作自己是个小白–初始mysql mysql的运行过程和微信(c/s架构)类似,它的服务器程序直接与要存储的数据打交道,多个客户端程序可以连接到这个服务端程序,发送增删改查请求,然后服务器程序可以对数据进行处理.这些操作需要登录了my
  目录