Stop The World
GC和应用同时运行,可能在GC期间,新增了对象引用,但是这个对象被GC了的严重问题。
所以在GC的某个环节,需要暂停应用运行。
垃圾回收算法
标记 - 清除(Mark-Sweep)算法
会产生内存碎片,String和数组等需要连续的内存空间来存储。
标记 - 整理(Mark-Compact)算法
整理的顺序:任意顺序,线性顺序,滑动顺序
任意顺序:
优点:实现简单,执行速度快。两次遍历。
缺点:适合处理固定大小的对象,如果大小不一样会增加处理逻辑。
可用双指针算法
对撞指针:头指针找空闲空间,尾指针找已用空间,然后交换位置。两个指针对撞后,各自返回更新指针引用地址。流程:复制对象→更新引用→清理服之前的空间
线性顺序:有引用关系的对象整理到一起。
滑动顺序:
Lisp2算法:3次遍历速度慢一些;能处理大小不同的对象。需要一个额外的空间记录内存空间移动位置。
第一次遍历:记录内存移动信息
一个指针找空闲内存,一个指针找可达对象
第二次遍历:修改引用关系
第三次遍历:移动对象位置
单次遍历算法:1次遍历,需要额外的表来记录:标记位向量,偏移位向量,内存索引号。
一次遍历完成记录,然后根据记录完成对象移动和索引更新。
需要用能够创建和标记指针的语言来实现。
把内存分成很多块,标记位向量:记录内存开始和结束位置。
偏移位向量:只记录开头不记录结尾,移动到哪里。
算法是抽象概念,不同厂商,不同垃圾收集器实现会有差异。
分代收集
不通区域使用不通的垃圾收集策略。
young区:对象快速产生,快速回收,仅有少部分会留存。GC频率高, 使用复制算法。
old区:对象存在时间长,GC频率低,次数少,对效率容忍度高,用标记整理算法,有充分的时间进行标记。