jvm-垃圾清除阶段的GC算法
一:复制算法
核心思想: 将内存空间一分为二,每次只是用其中一块,在垃圾回收时,将还存活的对象复制到另一块内存空间,原来的内存空间全部清除,
然后交换两块内存的角色.
二: 标记-清除算法
当堆中的可用内存被耗尽时,就会停止整个应用程序(用户线程)[stop the world],然后进行两项工作;第一是标记,第二是清除
1,标记: 收集器从根节点开始遍历,沿着引用链标记所有被引用的对象,一般是在对象的header中记录为可达对象
2,清除: 收集器对堆内存从头到尾进行线性遍历,如果发现某个对象在其header中没有标记为可达对象,则将其回收.
mark-sweep(标记清除算法的缺点和注意事项)
执行效率不算高,产生内存碎片,维护一个空闲列表,增加了内存开销
三:标记-整理(压缩)算法
执行过程:
1,第一阶段和标记-清除算法一样,从根节点标记所有引用的对象,
2,第二阶段将所有存活的对象压缩到内存的一侧,按顺序排放(使用指针碰撞为新对象分配内存空间)
3, 清理边界外的所有空间
优缺点:
优点:
跟标记清除算法比: 没有内存碎片,新对象分配内存使用指针碰撞,不需要维护一个空闲列表
跟复制算法比: 内存空间利用效率高
缺点:
效率上说,低于复制算法
移动对象时,如果对象被其他对象引用,还需要调整引用的地址
移动时必须停止所有用户线程(stop the world)