JVM - GC定位及清除算法

685 阅读2分钟

垃圾定位算法

Refrence Count

Refrence Count 引用计数

A 引用 B B的引用数+1   

B 引用 C C的引用数+1  

C 引用 A A的引用数+1   

image.png 使用引用计数的缺点就是 A,B,C循环引用 都是1 就无法确定是否为垃圾对象了

缺点显而易见 就是无法解决循环依赖

Root Searching

Root Searching 简称根可达

Root分为: 
   1. 栈中栈帧中变量指针,正在执行的线程
   2. 常量池中的静态变量或者常量
   3. Native 指针

从上面3个根开始查找 找不到的对象 都为垃圾数据 需要回收

垃圾清理算法

MarkSweep

MarkSweep 标记清理

  1. 通过根可达找到对应有用的数据,其他的数据全部为垃圾数据 
  2. 未标记的数据全部为垃圾数据 也就是上图的虚线部分 
  3. 清理垃圾数据


image.png

上图黑色部分 通过根可达算法定位有用的对象,其他未标记的对象都是垃圾数据 那么将会清理不是黑色的数据

缺点:

1.内存可用地址不连续,造成内存碎片 如果碎片太多 会导致最后大内存数据无法放入内存
2.效率一般 ,第一次通过根可达算法找到有用数据,第二次扫描内存列表 删除未标记的数据
3.内存碎片需要使用到集合记录空闲区域,下次分配通过空闲内存区域分配

优点:

 不需要额外空间

Copying

Copying 复制

 1. 通过根可达算法 找到所有有用的数据
 2. 复制有用的数据 至另外一块内存区域 删除原有区域的垃圾数据

image.png 上图根据根可达算法 将A A1 A2对象复制移动到 S1区域,更改Stack中的指针到S1区域中的对象, 并且删除整个eden区域

缺点:

 需要预留内存 提供复制有效数据 复制移动过程需要修改原有引用的指针指向

优点:

 效率快 不需要额外空间 只需要标记垃圾数据 直接清理

MarkCompact

标记整理

1.通过RootSearching 找到有用数据
2.从内存区域中任意一个角落开始整理数据 移动覆盖

image.png 假设实线部分是有用对象,虚线为垃圾数据 整理过程就是将D覆盖到B

缺点:

   效率偏低 需要将有用数据逐个复制移动替换 并且修改每个数据的指针指向      

优点:

   不需要提供额外内存空间  也能做到内存连续