一.垃圾收集算法(简单介绍思想和发展过程)
1.标记—清除 算法
首先标记处所有需要回收的对象,在标记完成后统一回收所有被标记的对象。
不足之处:
(1)效率:标记和清除两个过程效率不高
(2)空间问题:标记清除后会产生大量不连续的内存碎片,空间碎片太多导致以后程序运行时需要分配较大的对象时,无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。
2.复制算法
将可用内存容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。
不足之处:牺牲一半内存。
优化:新生代中的对象百分之九十八是朝生夕死,不需要按照1:1的比例来划分内存空间,而是将内存分为一块较大的Eden空间和两块较小的Survivor空间,每次使用Eden和其中的一块Survivor空间。当回收时,将Eden和Survivor中还存活的对象一次性地复制到另外一块Survivor空间上,最后清理Eden和刚才用过的Survivor空间,HotSpot虚拟机默认Eden和Survivor的大小比例是8:1,只有百分之十的内存会被浪费。
3.标记—整理算法
标记完之后让所有存活的对象都向一端移动,然后直接清理掉边界以外的内存。
4.分代收集算法
只是根据对象存活周期的不同将内存划分为几块。一般是把Java堆分为新生代和老年代。
二.HotSpot的算法实现
1.枚举根节点
可达性分析从GC Roots节点找引用链,作为GC Roots的节点主要在全局性的引用(例如常量或类静态属性)与执行上下文中。
在HotStop的实现中,是使用一组称为OopMap的数据结构来直接得知哪些地方存放着对象引用。
2.安全点
3.安全区域