- 术语解释
- Mark:标记,记录所有存活对象。
- Sweep:清除
- Compact:整理,有时译成压缩
- Copy:复制
- Gambage collection Roots(GC根元素)
- 正在执行方法里的局部变量和输入参数
- 活动线程(Active threads)
- 内存中所有类的静态字段(static field)
- JNI引用
- 安全点(safe point):可以安全的暂停线程的点
- 标记可达对象(Marking Reachable Objects)
GC 遍历内存中整体的对象关系图(object graph),从GC根扫描,到直接引用、其他对象(通过对象的属性域),都将被标记为存活对象。
注意事项
- 标记需要暂停所有应用线程,这种情景叫做Stop The World pause(全线暂停)
- 暂停时间与堆大小、对象总数没有直接关系,而是由存活对象的数量来决定。
- 删除不可达到对象(Removing Unused Objects)
- 清除(Sweep)
直接忽略所有垃圾,不可达到对象所占用的空间都被认为是空闲的,可以分配新对象。使用空闲表(free-list)来记录空闲区域
- 整理(Compact)
将所有存活对象迁移到内存空间的起始位置,依次放好。
缺点:
增加了GC暂停时间。
- 复制(Cpoy)
标记-复制算法(mark and copy)和标记整理算法(Mark and Compact)
相似: 两者都会移动到所有的存活对象。
区别:
标记-复制算法是将内存移动到存活区(另一个空间)。优点:标记和复制可以同时进行;缺点是需要额外的内存空间来存放所有的存活对象