序章
GC定义 垃圾回收,关注两件事:找垃圾、回收垃圾
GC好处 不用关心内存
GC历史 1960年,John McCarthy发布GC算法,标记-清除算法 1960年,George E. Collins发布引用计数法 1963年,Marvin L. Minsky发布复制算法
1、学习GC之前
对象 = 头 + 域 对象分为活动对象与非活动对象,就是回收的非活动对象
mutator,可以理解为应用程序
堆,用于动态存放对象的内存空间,动态也就是执行程序时
分配,在内存空间中分配对象。mutator要创建对象,向分配器申请空间,分配器中在堆中找合适空 间,分配给mutator
分块,为利用对象而事先准备出来的空间
根,是指向对象的指针起点部分
评价GC算法的性能的4个标准 1、吞吐量 2、最大暂停时间 3、堆使用效率 4、访问的局部性
2、GC标记-清除算法
四个阶段
1、标记,遍历对象并标记的过程 2、清除,回收没有打上标记的对象 3、分配,搜索空闲链表并寻找大小合适的分块 4、合并,合并在清除阶段进行,分配阶段会产生大量的小分块,如果它们是连续的,把所有连续的小分块连接起来形成一个大分块的过程
分配的策略 first-fit、best-fit、worst-fit
标记清除算法的优点 实现简单、与保守式GC算法兼容
延迟清除法,缩减因清除操作而导致的mutator最大暂停时间的方法。在标记操作结束后,不一定进行清除操作,而是通过延迟来防止mutator长时间暂停。
问题与解决方案
碎片化问题 压缩,第4、5章介绍 BiBOP法,将大小相近的对象整理成固定的块进行管理的做法
分配速度 多个空链表,创建只连接大分块的空闲链表和只连接小分块的空闲链表
与写时复制技术不兼容 位图标记,只收集各个对象的标志位并表格化,在标记的时候,不在对象的头里置位,而是在这个表格中的特定场所置位。