jvm-垃圾清除阶段的GC算法

一:复制算法

  核心思想: 将内存空间一分为二,每次只是用其中一块,在垃圾回收时,将还存活的对象复制到另一块内存空间,原来的内存空间全部清除,

  然后交换两块内存的角色.

       

二: 标记-清除算法

  当堆中的可用内存被耗尽时,就会停止整个应用程序(用户线程)[stop the world],然后进行两项工作;第一是标记,第二是清除

  1,标记: 收集器从根节点开始遍历,沿着引用链标记所有被引用的对象,一般是在对象的header中记录为可达对象

  2,清除: 收集器对堆内存从头到尾进行线性遍历,如果发现某个对象在其header中没有标记为可达对象,则将其回收.

  

  mark-sweep(标记清除算法的缺点和注意事项)

    执行效率不算高,产生内存碎片,维护一个空闲列表,增加了内存开销

  

  

三:标记-整理(压缩)算法

  执行过程:

  1,第一阶段和标记-清除算法一样,从根节点标记所有引用的对象,

  2,第二阶段将所有存活的对象压缩到内存的一侧,按顺序排放(使用指针碰撞为新对象分配内存空间)

  3, 清理边界外的所有空间

  优缺点:

    优点:

      跟标记清除算法比: 没有内存碎片,新对象分配内存使用指针碰撞,不需要维护一个空闲列表

      跟复制算法比: 内存空间利用效率高

    缺点:

      效率上说,低于复制算法

      移动对象时,如果对象被其他对象引用,还需要调整引用的地址

      移动时必须停止所有用户线程(stop the world)

猜你喜欢

转载自www.cnblogs.com/alenblue/p/12923659.html