垃圾定位算法
Refrence Count
Refrence Count 引用计数
A 引用 B B的引用数+1
B 引用 C C的引用数+1
C 引用 A A的引用数+1
使用引用计数的缺点就是 A,B,C循环引用 都是1 就无法确定是否为垃圾对象了
缺点显而易见 就是无法解决循环依赖
Root Searching
Root Searching 简称根可达
Root分为:
1. 栈中栈帧中变量指针,正在执行的线程
2. 常量池中的静态变量或者常量
3. Native 指针
从上面3个根开始查找 找不到的对象 都为垃圾数据 需要回收
垃圾清理算法
MarkSweep
MarkSweep 标记清理
1. 通过根可达找到对应有用的数据,其他的数据全部为垃圾数据
2. 未标记的数据全部为垃圾数据 也就是上图的虚线部分
3. 清理垃圾数据
上图黑色部分 通过根可达算法定位有用的对象,其他未标记的对象都是垃圾数据 那么将会清理不是黑色的数据
缺点:
1.内存可用地址不连续,造成内存碎片 如果碎片太多 会导致最后大内存数据无法放入内存
2.效率一般 ,第一次通过根可达算法找到有用数据,第二次扫描内存列表 删除未标记的数据
3.内存碎片需要使用到集合记录空闲区域,下次分配通过空闲内存区域分配
优点:
不需要额外空间
Copying
Copying 复制
1. 通过根可达算法 找到所有有用的数据
2. 复制有用的数据 至另外一块内存区域 删除原有区域的垃圾数据
上图根据根可达算法 将A A1 A2对象复制移动到 S1区域,更改Stack中的指针到S1区域中的对象,
并且删除整个eden区域
缺点:
需要预留内存 提供复制有效数据 复制移动过程需要修改原有引用的指针指向
优点:
效率快 不需要额外空间 只需要标记垃圾数据 直接清理
MarkCompact
标记整理
1.通过RootSearching 找到有用数据
2.从内存区域中任意一个角落开始整理数据 移动覆盖
假设实线部分是有用对象,虚线为垃圾数据 整理过程就是将D覆盖到B
缺点:
效率偏低 需要将有用数据逐个复制移动替换 并且修改每个数据的指针指向
优点:
不需要提供额外内存空间 也能做到内存连续